两个栈实现一个队列
2015-05-30 17:09
288 查看
栈是后进先出的数据结构,只允许在其一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端为栈底,栈的的基本操作为:入栈,出栈,返回栈顶元素,判断栈是否为空,
队列是先进先出的数据结构,只允许在其一端进行插入操作,而在另一端进行删除操作,允许删除的一端称为队头,允许插入的一端称为队尾 队列的基本操作为 : 入队,出队,返回队头元素,判断队列是否为空。
用两个栈stack1,stack2 来模拟队列的入队和出队。将 a,b,c,d 依次入队 a---->b----->c------>d,出队的顺序为 a,b,c,d;
用栈stack1来模拟入队,入队的元素压入stack1, 将,a,b,c,d 入队即为,将a,b,c,d 压入栈stack1中,此时stack2为空栈。 a,b,c,d 出队时,由于队列先进先出的特性。最先出队的为a 此时可以将stack1 的元素全部出栈压入栈stack2 中,此时,stack2 从栈顶到栈底的元素顺序依次为 a ,b,c,d ; 与元素出队的顺序一致,元素出队即从stack2出栈即可。
当队列进行出队操作时而恰好stack2 为空时,需要判断stack1是否为空,若为空则表示此时队列中无元素为空队列,若stack1不空则将栈stack1中的所有元出栈后压入stack2中。
再用stack2的出栈操作来模拟队列的出队操作。
队列是先进先出的数据结构,只允许在其一端进行插入操作,而在另一端进行删除操作,允许删除的一端称为队头,允许插入的一端称为队尾 队列的基本操作为 : 入队,出队,返回队头元素,判断队列是否为空。
用两个栈stack1,stack2 来模拟队列的入队和出队。将 a,b,c,d 依次入队 a---->b----->c------>d,出队的顺序为 a,b,c,d;
用栈stack1来模拟入队,入队的元素压入stack1, 将,a,b,c,d 入队即为,将a,b,c,d 压入栈stack1中,此时stack2为空栈。 a,b,c,d 出队时,由于队列先进先出的特性。最先出队的为a 此时可以将stack1 的元素全部出栈压入栈stack2 中,此时,stack2 从栈顶到栈底的元素顺序依次为 a ,b,c,d ; 与元素出队的顺序一致,元素出队即从stack2出栈即可。
当队列进行出队操作时而恰好stack2 为空时,需要判断stack1是否为空,若为空则表示此时队列中无元素为空队列,若stack1不空则将栈stack1中的所有元出栈后压入stack2中。
再用stack2的出栈操作来模拟队列的出队操作。
<pre name="code" class="cpp">#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<stack> #include<queue> using namespace std; template<class T> class myqueue { public: myqueue(){}; void push(const T& node); T pop(); ~myqueue(){}; bool empty(); private: stack<T> stack1;//栈stack1模拟入队时用 stack<T> stack2;//栈stack2模拟出队时用 }; template<class T> void myqueue<T>::push(const T&node) { stack1.push(node); } template<class T> T myqueue<T>::pop() { if(stack2.empty())//栈stack2 为空时要判断栈1中是否有元素,有的话则全部出栈进而压入栈stack2 中 { while(!stack1.empty()) { T temp=stack1.top(); stack1.pop(); stack2.push(temp); } } if(stack2.empty()) { throw exception("the queue is empty()"); } T head=stack2.top(); stack2.pop(); return head; } template<class T> bool myqueue<T>::empty() { if(stack1.empty()&&stack2.empty())//两个栈都为空则表示队列为空 { return true; } else { return false; } } int main() { myqueue<int> test; for(int i=0;i<10;i++) { test.push(i); } while(!test.empty()) { cout<<test.pop()<<" "; } myqueue<int> test2; test2.pop(); return 0; }
相关文章推荐
- js 图片上传前浏览
- 最小重量机器设计问题——优先队列式分支限界法
- 设计模式——原型模式
- linux配置java环境变量(详细)
- 单片机之花样流水灯
- 【建图+最短路】Bzoj1001 狼抓兔子
- 人口变动的经济分析
- java使用堆结构实现优先队列
- C# SqlServerHelper 代码完整示例
- 排序算法(python实现)
- 通过GeoIP2分析访问者IP获取地理位置信息
- Android Library工程实现模块复用(代码及资源文件)
- STL--queue
- 坚持教学与科研相结合
- Oracle 11g新参数USE_LARGE_PAGES与AMM使用 (转载)
- WatchKit Storyboard攻略
- wust 1420 We love FibonaQ(矩阵+线段树)
- 标准acl配置
- 树莓派控制GPIO
- jquery自定义控件拖拽框dragbox