使用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
原创粉丝点击