思路:用两个栈来模仿队列,就是要用两个后进先出的数据结构来实现先进先出的功能。
举个简单的例子:(用#代表栈底,->表示队列的方向)
初始状态:可以知道,这是可行的,如果需要出队列,只需要stack1不停弹栈即可
stack 1: #4,3,2,1
stack 2: #
queue:4,3,2,1->
此时如果需要入队列,那么队列就应该是这样子:queue : 5,4,3,2,1->
如何用栈来模拟呢?可以这么做!
step 1: 把stack 1的值全弹出到stack2
step 2: 把5压入栈stack 1
step 3: 把stack 2的值全弹出到stack1
根据这个思路可以写出如下代码:
#include<stack> #include<iostream> using namespace std; struct Queue { private: stack<int> st1;//保存内容 stack<int> st2;//缓冲区 public: void push(int _val) { int _Temp; while(!st1.empty()) { _Temp=st1.top(); st1.pop(); st2.push(_Temp); } st1.push(_val); while(!st2.empty()) { _Temp=st2.top(); st2.pop(); st1.push(_Temp); } } int pop() { if(st1.empty()) { std::cout<<"Empty Queue!"<<std::endl; return -1; } int _Temp=st1.top(); st1.pop(); return _Temp; } }; int main() { int A[]={4,3,7,9,11,35}; int len=sizeof(A)/sizeof(A[0]); Queue Q; for(int i=0;i<len;++i) { Q.push(A[i]); } for(int i=0;i<len;++i) { cout<<Q.pop()<<' '; } return 0; }
用两个队列实现一个栈同理也比较容易。
举个例子:
queue 1 : 5,4,3,2,1->
queue 2 :->
stack : #5,4,3,2,1
当需要弹栈的时候,只需要非空队列出列即可。
当需要压栈 (6) 的时候,栈会变成stack : # 5,4,3,2,1,6
队列模拟应该是:
1.6进空队列
2.非空队列压到空队列。
代码如下:
#include<iostream> #include<queue> using namespace std; class stack { private: queue<int> q1; queue<int> q2; public: void push(int _val) { int _Temp; if(q1.empty()) { q1.push(_val); while(!q2.empty()) { _Temp=q2.front(); q2.pop(); q1.push(_Temp); } } else { q2.push(_val); while(!q1.empty()) { _Temp=q1.front(); q1.pop(); q2.push(_Temp); } } } int pop() { if(!q1.empty()) { int _Temp=q1.front(); q1.pop(); return _Temp; } else { int _Temp=q2.front(); q2.pop(); return _Temp; } } }; int main() { int A[]={4,3,7,9,11,35}; int len=sizeof(A)/sizeof(A[0]); stack st; for(int i=0;i<len;++i) { st.push(A[i]); } for(int i=0;i<len;++i) { cout<<st.pop()<<' '; } return 0; }