C++ 队列(queue)堆栈(stack)实现基础
Queue
在C++中只要#include<queue>即可使用队列类,其中在面试或笔试中常用的成员函数如下(按照最常用到不常用的顺序)
1. push
2. pop
3. size
4. empty
5. front
6. back
接下来逐一举例说明:
1. push
队列中由于是先进先出,push即在队尾插入一个元素,如:
- 1 queue<string> q;
- 2 q.push("Hello World!");
- 3 q.push("China");
- 4 cout<<q.front()<<endl;
可以输出:Hello World!
2. pop
将队列中最靠前位置的元素拿掉,是没有返回值的void函数。如:
- 1 queue<string> q;
- 2 q.push("Hello World!");
- 3 q.push("China");
- 4 q.pop();
- 5 cout<<q.front()<<endl;
可以输出:China
原因是Hello World!已经被除掉了。
3. size
返回队列中元素的个数,返回值类型为unsigned int。如:
- queue<string> q;
- cout<<q.size()<<endl;
- q.push("Hello World!");
- q.push("China");
- cout<<q.size()<<endl;
输出两行,分别为0和2,即队列中元素的个数。
4. empty
判断队列是否为空的,如果为空则返回true。如:
- 1 queue<string> q;
- 2 cout<<q.empty()<<endl;
- 3 q.push("Hello World!");
- 4 q.push("China");
- 5 cout<<q.empty()<<endl;
输出为两行,分别是1和0。因为一开始队列是空的,后来插入了两个元素。
5. front
返回值为队列中的第一个元素,也就是最早、最先进入队列的元素。注意这里只是返回最早进入的元素,并没有把它剔除出队列。如:

- 1 queue<string> q;
- 2 q.push("Hello World!");
- 3 q.push("China");
- 4 cout<<q.front()<<endl;
- 5 q.pop();
- 6 cout<<q.front()<<endl;

输出值为两行,分别是Hello World!和China。只有在使用了pop以后,队列中的最早进入元素才会被剔除。
6. back
返回队列中最后一个元素,也就是最晚进去的元素。如:
- 1 queue<string> q;
- 2 q.push("Hello World!");
- 3 q.push("China");
- 4 cout<<q.back()<<endl;
输出值为China,因为它是最后进去的。这里back仅仅是返回最后一个元素,也并没有将该元素从队列剔除掉。
其他的方法不是很常用,就不再研究了。
接下来我们使用链表,自己将queue类写出来,将其所有方法都实现。代码都是自己写的,最后随便写了点main函数小测一下,没有发现问题,如果有不足还望能指正。如下:
- #include<iostream>
- #include<string>
- using namespace std;
- template <typename T>
- struct Node{
- T value;
- Node<T> *next;
- Node<T>(){next = NULL;}
- };
- template <typename T>
- class MyQueue{
- private:
- unsigned int num;
- Node<T> *first;
- Node<T> *last;
- public:
- MyQueue();
- ~MyQueue();
- unsigned int size();
- void push(T element);
- void pop();
- bool empty();
- T back();
- T front();
- };
- template <typename T>
- MyQueue<T>::MyQueue(){
- num = 0;
- first = NULL;
- last = NULL;
- }
- template <typename T>
- MyQueue<T>::~MyQueue(){
- while(!empty()){
- pop();
- }
- }
- template <typename T>
- unsigned int MyQueue<T>::size(){
- return num;
- }
- template <typename T>
- bool MyQueue<T>::empty(){
- return (0==num);
- }
- template <typename T>
- void MyQueue<T>::push(T element){
- Node<T> *temp = new Node<T>;
- temp->next = NULL;
- temp->value = element;
- if (0 == this->num){
- first = temp;
- last = temp;
- }else{
- last->next = temp;
- last = temp;
- }
- (this->num)++;
- }
- template <typename T>
- void MyQueue<T>::pop(){
- if (0==this->num){
- cout<<"No elements in the queue!"<<endl;
- }else if(1 == this->num){
- delete first;
- first = NULL;
- last = NULL;
- this->num = 0;
- }else{
- Node<T> *temp = first;
- first = first->next;
- delete temp;
- (this->num)--;
- }
- }
- template <typename T>
- T MyQueue<T>::back(){
- if (0==this->num){
- cout<<"No elements in the queue!"<<endl;
- return NULL;
- }
- return last->value;
- }
- template <typename T>
- T MyQueue<T>::front(){
- if(0== this->num){
- cout<<"No elements in the queue!"<<endl;
- return NULL;
- }
- return first->value;
- }
- int main(){
- MyQueue<string> q;
- q.push("Hello world");
- q.push("China");
- cout<<q.front()<<endl;
- cout<<q.size()<<endl;
- cout<<q.back()<<endl;
- q.pop();
- cout<<q.empty()<<endl;
- cout<<q.back()<<endl;
- cout<<q.front()<<endl;
- q.pop();
- cout<<q.size()<<endl;
- cout<<q.empty()<<endl;
- system("pause");
- return 0;
- }
- 队列实现
Stack
进栈出栈顺序问题
题目:两个数组,长度相同,都为n,两个数组分别为inseq和outseq,求出如果以inseq为入栈顺序,那么outseq可不可能是它的一个出栈顺序,可能则返回true
样例:
inseq = {1,2,3,4,5} outseq={5,4,3,2,1} 返回true;
inseq = {1,2,3,4,5} outseq={4,3,2,1,5},返回true;
inseq = {1,2,3,4,5} outseq={2,3,5,1,4},返回false。
解题思路:模拟整个过程,挨个把inseq的数据放入栈中。直到栈顶元素和出栈序列outseq所指的元素相同,则一直出栈,并将outseq指针后移,直到栈顶元素和outseq指针所指的元素不一样了,则又开始进栈。每次循环中,要么进栈,要么出栈,总要有一个动作在执行,如果既没出栈也没进栈,一定出了什么问题,直接跳出循环,最后进行判断。代码如下:
- #include <iostream>
- #include <stack>
- using namespace std;
- bool islegal(int *inseq, int *outseq, int n){
- if(n==0) return true;
- if(n==1) return inseq[0]==outseq[0];
- stack<int> st;
- int i=0,j=0;
- bool flag = false; //用于确定每一个最外层while循环中有操作在执行,没有操作可以执行,则必然有违反的情况
- while(j<n){
- if((st.empty() || (st.top()!= outseq[j])) && i<n){//如果栈为空或者第一个元素不等于出栈序列第一个元素,且i<n,则进栈
- st.push(inseq[i]);
- i++;
- flag = true;
- }
- if(!st.empty() && st.top()== outseq[j] ){//如果栈不为空,并且第一个元素等于出栈序列第一个元素,则出栈
- st.pop();
- j++;
- flag = true;
- }
- if (!flag)
- break;
- else
- flag = false;
- }
- if(st.empty() && j==n && i==n)
- return true;
- return false;
- }
- int main(){
- int a[] = {1,2,3,4,5};
- int b[] = {4,3,5,2,1};
- cout<<islegal(a,b,5);
- system("pause");
- return 0;
- }
C++ 队列(queue)堆栈(stack)实现基础的更多相关文章
- C# 队列(Queue) 和堆栈(Stack)
队列 (Queue) ...
- python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转 Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作. 栈的实现: class Stack(object): #初始化栈为空列表 def _ ...
- 网络编程基础--多线程---concurrent.futures 模块---事件Event---信号量Semaphore---定时器Timer---死锁现象 递归锁----线程队列queue
1 concurrent.futures 模块: # from abc import abstractmethod,ABCMeta # # class A(metaclass=ABCMeta): # ...
- STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较
栈stack .队列queue 和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...
- 算法与数据结构基础 - 堆栈(Stack)
堆栈基础 堆栈(stack)具有“后进先出”的特性,利用这个特性我们可以用堆栈来解决这样一类问题:后续的输入会影响到前面的阶段性结果.线性地遍历输入并用stack处理,这类问题较简单,求解时间复杂度一 ...
- C++栈(stack)、队列(queue)、链表(list)的常用函数
C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...
- js里实现队列与堆栈
在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法,而对于JS来说,我们可以实现数组的相关操作,来实现队列和堆栈的功能,看下面的相关介绍. 一 看一下它们的性质,这种 ...
- JS~js里实现队列与堆栈
在面向对象的程序设计里,一般都提供了实现队列(queue)和堆栈(stack)的方法,而对于JS来说,我们可以实现数组的相关操作,来实现队列和堆栈的功能,看下面的相关介绍. 一 看一下它们的性质,这种 ...
- 【java多线程】队列系统之说说队列Queue
转载:http://benjaminwhx.com/2018/05/05/%E8%AF%B4%E8%AF%B4%E9%98%9F%E5%88%97Queue/ 1.简介 Queue(队列):一种特殊的 ...
- [转载]队列queue和双端Dequeue
转载自:http://uule.iteye.com/blog/2095650?utm_source=tuicool 注意:这都只是接口而已 1.Queue API 在java5中新增加了java.ut ...
随机推荐
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划194:bzoj2115: [Wc2011] Xor
http://www.lydsy.com/JudgeOnline/problem.php?id=2115 边和点可以重复经过,那最后的路径一定是从1到n的一条路径加上许多环 dfs出任意一条路径的异或 ...
- C++ socket 网络编程 简单聊天室
操作系统里的进程通讯方式有6种:(有名/匿名)管道.信号.消息队列.信号量.内存(最快).套接字(最常用),这里我们来介绍用socket来实现进程通讯. 1.简单实现一个单向发送与接收 这是套接字的工 ...
- Windows命令-系统木马取样
1.前言 工作中偶尔会遇到去现场提取木马样本回公司分析的情况.如果是生产环境下,不方便安装各类抓包.安全软件时.能用系统自带的命令去定位出木马程序相关的信息是最理想不过的状态. 2.Windows常用 ...
- Paint House
There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...
- Nagios配置文件nagios.cfg详解
这里开始要讲一些Nagios的配置. 首先要看看目前Nagios的主配置路径下有哪些文件.[root@nagios etc]# ll总用量 152-rwxrwxr-x. 1 nagios nagios ...
- linux服务器账号密码正确无法登录
登录服务器时,发现密码错误,输入后还是错误不能登录 最后发现登录日志中有pam_tally2(sshd:auth): user root (0) tally 53, deny 6 less /var/ ...
- Project Euler Problem3
Largest prime factor Problem 3 The prime factors of 13195 are 5, 7, 13 and 29. What is the largest p ...
- Gitlab & Github
windwos上Git的使用 软件下载地址:https://github.com/git-for-windows/git/releases/download/v2.15.1.windows.2/Git ...
- 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (上篇)
Universal Windows Platform(UWP)是微软Windows10专用的通用应用平台,其目的在于在统一操作系统下控制所有智能电子设备. 自从Unity 5.2之后,配合VS 201 ...