使用两个队列实现一个栈
2014-10-05 19:20
387 查看
思路:
有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。
如果继续做push操作,比如插入d,f,则把d,f插入到q2中,
此时若要做pop操作,则做步骤2
以此类推,就实现了用两个队列来实现一个栈的目的。
注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。
对于push和pop操作,其时间为O(n).
#include<iostream> #include<stdlib.h> #include<stack> #include<queue> using namespace std; template <typename T>class CStack { public: CStack(void){}; ~CStack(void){}; void push(const T& node); T pop(); private: queue<T> queue1; queue<T> queue2; }; //²åÈëÔªËØ template <typename T> void CStack<T>::push(const T& element) { if(queue1.size()>0)//Èç¹ûqueue1²»Îª¿ÕÔòÍùqueue1ÖвåÈëÔªËØ queue1.push(element); else if(queue2.size()>0)//Èç¹ûqueue2²»Îª¿ÕÔòÍùqueue2ÖвåÈëÔªËØ queue2.push(element); else//Èç¹ûÁ½¸ö¶ÓÁж¼Îª¿Õ£¬ÔòÍùqueue1ÖвåÈëÔªËØ queue1.push(element); } //ɾ³ýÔªËØ template <typename T> T CStack<T>::pop() { if(queue1.size()==0)//Èç¹ûqueue1Ϊ¿Õ { while(queue2.size()>1)//±£Ö¤queue2ÖÐÓÐÒ»¸öÔªËØ£¬½«ÆäÓàÔªËر£´æµ½queue1ÖÐ { queue1.push(queue2.front()); queue2.pop(); } T& data=queue2.front(); queue2.pop(); return data; } else//Èç¹ûqueue2Ϊ¿Õ { while(queue1.size()>1)//±£Ö¤queue2ÖÐÓÐÒ»¸öÔªËØ£¬½«ÆäÓàÔªËر£´æµ½queue1ÖÐ { queue2.push(queue1.front()); queue1.pop(); } T& data=queue1.front(); queue1.pop(); return data; } } void main() { CStack<int> stack; stack.push(1); stack.push(2); stack.push(3); stack.push(4); int len=4; while(len>0) { cout<<stack.pop()<<" "; --len; } }
相关文章推荐
- 算法导论 使用两个队列实现一个栈
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 使用两个队列实现一个栈,使用两个栈实现一个队列!
- 剑指offer 7---使用两个栈实现一个队列
- 使用两个栈实现一个队列
- 剑指offer 7---使用两个队列实现一个栈
- 使用两个队列实现一个栈
- ~使用两个栈实现一个队列(优化版)~
- 【题目5】如何使用两个栈来实现一个队列
- 013使用两个栈实现一个队列(keep it up)
- 使用两个栈实现一个队列
- 使用两个栈实现一个队列
- ~使用两个队列实现一个栈~
- 使用两个队列实现一个栈
- 数据结构-使用两个栈实现一个队列
- 使用两个队列实现一个栈,使用两个栈实现一个队列!
- 算法面试题:使用两个堆栈实现一个队列
- ~使用两个栈实现一个队列~
- 使用两个栈实现一个队列