两个队列实现栈
Posted 泡面小王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个队列实现栈相关的知识,希望对你有一定的参考价值。
http://www.cnblogs.com/kaituorensheng/archive/2013/03/02/2939690.html
//前提已知 typedef struct queue { int queuesize; int head, tail; int *q; }Queue; void InitQueue(Queue *q); void EnQueue(Queue *q, int key); int DeQueue(Queue *q); int SizeOfQueue(Queue *q); int IsQueueEmpty(Queue *q); int IsQueueFull(Queue *q);
思路
q1是专职进出栈的,q2只是个中转站
- 入栈:直接入队列q1即可
- 出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中
图示
参考代码
void Push(Queue *q1, Queue *q2, int k) { EnQueue(q1, k); } int Pop(Queue *q1, Queue *q2) { int tmp; if(IsQueueEmpty(q1) == 1) { printf("Stack Empty!\\n"); } else { while(SizeOfQueue(q1) != 1) { EnQueue(q2, DeQueue(q1)); } tmp = DeQueue(q1); while(IsQueueEmpty(q2) == 0) { EnQueue(q1, DeQueue(q2)); } return tmp; } }
思路二:
#include <iostream> #include <queue> using namespace std; class cStack { public: cStack() { count=0; } void enque(int num)//入队的实现 { if(q1.size()==0&&q2.size()==0)//q1和q2为空 q1.push(num); else if(q1.size()>0)//q1不为空,q1入队 q1.push(num); else if(q2.size()>0)//q2不为空,q2入队 q2.push(num); ++count; } int Deque()//出队的实现 { int res; if(q2.size()==0)//q2为空 { while(q1.size()!=1)//q1不为空,q1出队剩下一个元素,就是出栈的元素 { int data=q1.front(); q1.pop(); q2.push(data); } res=q1.front(); q1.pop(); //cout<<res<<endl; } else//q2不为空,q2出队剩下一个元素,就是出栈的元素 { while(q2.size()!=1) { int data=q2.front(); q2.pop(); q1.push(data); } res=q2.front(); q2.pop(); // cout<<res<<endl; } count--; return res; } int getNum() const { return count; } private: queue<int>q1; queue<int>q2; int count; }; int main() { cStack s1; for(int i=0;i<10;i++) s1.enque(i); cout<<"栈中数的个数"<<s1.getNum()<<endl; for(int j=0;j<5;j++) { int data=s1.Deque(); cout<<data<<endl; } return 0; }
以上是关于两个队列实现栈的主要内容,如果未能解决你的问题,请参考以下文章