使用2个队列实现一个栈
2015-08-30 20:50
288 查看
队列的特点是先入后出,栈的特点与之相反,是后入先出。可以定义两个队列来实现一个栈的功能,定义队列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中的这个元素并返回。
当向该栈中压入元素时:
若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; }测试结果:
相关文章推荐
- UVA 607 二十二 Scheduling Lectures
- 一个关于单词的字谜问题
- uva 11292 好长的英语题(简单的题目)
- V210 系统时间设置
- HDU1223-还是畅通工程-prim算法(模板题)
- 你是谁不重要 重要的是你和谁在一起
- 关于分布式系统的数据一致性问题(三)
- UVA 590 二十一 Always on the run
- UVA 442 二十 Matrix Chain Multiplication
- “全排列”问题系列(一)[LeetCode] - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题
- Java基础知识强化10:Java中的中间缓存变量机制
- UFFS文件系统使用心得
- 【JavaScript】DOM操作下拉框
- iOS学习总结之UI框架UI之文本输入控件( UITextField)
- 分支结构练习-6.实现购物结算功能
- A Gentle Guide to Machine Learning
- UVA 437 十九 The Tower of Babylon
- 数据库面试题
- 卸载win10内置windows app的方法
- chrmoe debug