面试---两个队列实现一个栈
来源:互联网 发布:非线性规划的最优化 编辑:程序博客网 时间:2024/06/05 10:20
解法思路:
(1)设置两个队列q1和q2。(2)栈的push操作:每次往非空队列里插入元素。起初都为空的时候则往q1中插入。(3)栈的pop操作:把非空队列里除最后一个元素外先转移到另一队列(为空),然后把剩下的最后一个元素弹出。这样另一个队列便作为下次插入的对象。(4)以此类推。
注:此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。
这样实现的栈的push和pop操作,其时间复杂度为O(n).
#include<iostream>#include<queue>using namespace std;template <class T> class CStack{public: void push_stack(const T &); T pop_stack();private: queue<T> q1; queue<T> q2;};template <class T> void CStack<T>::push_stack(const T &data){//每次往不空的队列插入元素,若都为空则往q1插入 q1.size() >= q2.size()?q1.push(data):q2.push(data);}template <class T> T CStack<T>::pop_stack(){ if(q1.size()==0)//如果q1为空 { while(q2.size()>1)//把q2的除最后一个元素外全部转移到队q1中 { q1.push(q2.front()); q2.pop(); } T& front1=q2.front();//取队列头元素 q2.pop(); return front1; } else//如果q2为空 { while(q1.size()>1)//把q1的除最后一个元素外全部转移到队q2中 { q2.push(q1.front()); q1.pop(); } T& front2=q1.front(); q1.pop(); return front2; }}int main(){ CStack<int> s; s.push_stack(1); s.push_stack(2); s.push_stack(3); cout<<"元素出栈:"<<endl;//后入先出 cout<<s.pop_stack()<<endl; cout<<s.pop_stack()<<endl; cout<<s.pop_stack()<<endl; return 0;}
0 0
- 面试---两个栈实现一个队列
- 面试---两个队列实现一个栈
- 【数据结构】 两个栈实现一个队列【面试】
- 面试15之用两个栈去实现一个队列
- 两个队列实现一个栈&两个栈实现一个队列
- 两个栈实现一个队列-----两个队列实现一个栈
- 两个栈实现一个队列&&两个队列实现一个栈
- 两个栈实现一个队列 && 两个队列实现一个栈
- 两个栈实现一个队列,两个队列实现一个栈
- 两个栈实现一个队列/两个队列实现一个栈
- 两个栈实现一个队列&两个队列实现一个栈
- 两个队列实现一个栈&两个栈实现一个队列
- 两个队列实现一个栈 / 两个栈实现一个队列
- 两个栈实现一个队列,两个队列实现一个栈
- 两个栈实现一个队列&两个队列实现一个栈
- 两个栈实现一个队列&&两个队列实现一个栈
- 两个栈实现一个队列&两个队列实现一个栈
- 两个栈实现一个队列/两个队列实现一个栈
- ORACLE RAC ASM环境下DATAGUARD搭建步骤
- php开启openssl
- 【FastDev4Android框架开发】Android实现沉浸式状态栏(六)
- 组件化开发
- [胡策题] 魔法水晶 树上问题~(四星)
- 面试---两个队列实现一个栈
- eclipse-关于org.eclipse.wst.server.core
- Linux系统进程管理
- Quartz中时间表达式的设置-----corn表达式
- Monitoring Storage Devices with iostat
- 一个关于js代码如何获取服务器时间问题
- web三大组件之一——Servlet
- The study of crack(1.Shelling FSG v2.0)
- jquery 做一个小的倒计时效果