使用2个队列实现一个栈
来源:互联网 发布:假授权书能过淘宝吗 编辑:程序博客网 时间:2024/04/29 13:30
队列的特点是先入后出,栈的特点与之相反,是后入先出。可以定义两个队列来实现一个栈的功能,定义队列queue1与queue2。
当向该栈中压入元素时:
若queue1与queue2都为空时,可以把该元素加入这2个队列的任一个。
若queue1不为空,queue2为空时,可以把该元素加入队列queue1中。
若queue1为空,queue2不为空时,可以把该元素加入队列queue2中。
当从该栈中弹出元素时:
当queue1与queue2都为空时,则表明该栈为空。
当queue1不为空,queue2为空时,将queue1中元素弹出并依次压入queue2中,直到queue1中剩余一个元素。然后弹出queue1中的这个元素并返回。
当queue1为空,queue2不为空时,将queue2中元素弹出并依次压入queue1中,直到queue2中剩余一个元素。然后弹出queue2中的这个元素并返回。
#include<queue>template<typename T> class Cstack{public: Cstack();~Cstack();void push_val(T val);bool empty()const{return que1.empty()&&que2.empty();}size_t size()const{return que1.size()+que2.size();}T pop_val();private:queue<T> que1;queue<T> que2;};template<typename T> Cstack<T>::Cstack(){}template<typename T> Cstack<T>::~Cstack(){}template<typename T> void Cstack<T>::push_val(T val){if(que1.empty())//que1为空,que2可能为空或不为空que2.push(val);else //que1不为空,que2一定为空que1.push(val);//不可能que1和que2都不为空}template<typename T> T Cstack<T>::pop_val(){T temp;if(que1.empty()&&que2.empty()){cout<<"Empty stack!"<<endl;}else if(!que1.empty()&&que2.empty())//que1不 为空,que2为空{while(que1.size()!=1){temp=que1.front();que1.pop();que2.push(temp);}temp=que1.front();que1.pop();return temp;}else//que1为空,que2不为空{while(que2.size()!=1){T temp=que2.front();que2.pop();que1.push(temp);}temp=que2.front();que2.pop();return temp;}}测试程序:
void test1(){Cstack<int> cs;if(cs.empty())cout<<"cs is empty!"<<endl;cout<<"cs size is"<<cs.size()<<endl;}void test2(){const int len=5;Cstack<int> cs;for(int ii=0;ii<len;ii++){int randnum=rand();cout<<randnum<<" ";cs.push_val(randnum);}cout<<endl;for(int ii=0;ii<len;ii++){cout<<cs.pop_val()<<" ";}}int main(){test1();test2();return 0;}测试结果:
0 0
- 使用2个队列实现一个栈
- 2个栈实现一个队列
- 2个队列实现一个栈
- JavaShowAlgorithm-使用2个队列实现栈
- JavaShowAlgorithm-使用2个栈实现队列
- 连个队列实现一个栈
- 使用一个栈实现一个队列
- 栈和队列之用2个栈实现一个队列
- 栈&队列--使用两个栈实现一个队列+使用两个队列实现一个栈
- Cracking coding interview(3.5)使用2个堆栈实现一个队列
- 使用两个队列实现一个栈
- 使用两个队列实现一个栈
- 使用两个栈实现一个队列
- 使用两个栈实现一个队列
- 使用两个队列实现一个栈
- 数据结构-使用两个栈实现一个队列
- 使用两个队列实现一个栈
- 使用两个栈实现一个队列
- opencv动态地址方式操作像素-at操作
- Servlet
- 安装SVN报错
- 泛型 ---- 泛型在接口上的使用
- 【JavaScript】小样例-js仿jquery的表单验证
- 使用2个队列实现一个栈
- virtualBox 下安装redhat 6 及用xmanager 连接 linux
- 防干扰继电器控制电路
- 写在前面
- svg的transform属性
- web.xml中load-on-startup的作用
- STL中的Stack
- Android Studio App LinearLayout多层布局嵌套
- html标记--1