博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【100题】第五十七题 用两个栈实现队列
阅读量:7122 次
发布时间:2019-06-28

本文共 2596 字,大约阅读时间需要 8 分钟。

一,题目

       某队列的声明如下:

template
class CQueue{public: CQueue() {} ~CQueue() {} void appendTail(const T& node); // append a element to tail void deleteHead(); // remove a element from headprivate: T m_stack1; T m_stack2;};

二,分析

          栈:后入先出,插入删除在栈顶操作

          队列:先入先出,插入在队尾,删除在队首

          因此对队列进行的插入和删除操作都是在栈顶上进行;我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。

          1)stack1  入队队列 的栈

          2)stack2  出队队列 的栈,如果出队列时候,stack2为空则将stack1中元素全部弹入stack2,然后出栈

三,参考代码如下:

 

template
void CQueue
::appendTail(const T& element)//入队 { m_stack1.push(element);}template
void CQueue
::deleteHead() //出队 { if(m_stack2.size() <= 0) { while(m_stack1.size() > 0) { T& data = m_stack1.top(); m_stack1.pop(); m_stack2.push(data); } } assert(m_stack2.size() > 0); m_stack2.pop();}

扩展:用两个队列实现一个栈?

思路:

        1.有两个队列q1和q2,先往q1内插入a,b,c,这做的都是栈的push操作。

        2.现在要做pop操作,即要得到c,这时可以将q1中的a,b两个元素全部dequeue并存入q2中,这时q2中元素为a,b,对q1再做一次dequeue操作即可得到c。
        3.如果继续做push操作,比如插入d,f,则把d,f插入到q2中,
        4.此时若要做pop操作,则做步骤2
        5.以此类推,就实现了用两个队列来实现一个栈的目的。

       注意在此过程中,新push进来的元素总是插入到非空队列中,空队列则用来保存pop操作之后的那些元素,那么此时空队列不为空了,原来的非空队列变为空了,总是这样循环。

对于push和pop操作,其时间为O(n).

 

#include 
#include
#include
using namespace std;// 两个队列实现一个栈template
class CStack{public: CStack() {} ~CStack() {} void mypush(const T& element); void mypop(); private: deque
m_queue1; deque
m_queue2;};template
void CStack
::mypop() //出栈 { if (m_queue1.size() == 0) { while (m_queue2.size() > 1) { T& data = m_queue2.front(); m_queue2.pop_front(); m_queue1.push_back(data); } assert(m_queue2.size() == 1); //确保队列2内有一个元素 T& result = m_queue2.front(); m_queue2.pop_front(); cout << result << endl; } else if (m_queue2.size() == 0) { while (m_queue1.size() > 1) { T& data = m_queue1.front(); m_queue1.pop_front(); m_queue2.push_back(data); } assert(m_queue1.size() == 1); //确保队列1内有一个元素 T& result = m_queue1.front(); m_queue1.pop_front(); cout << result << endl; }}template
void CStack
::mypush(const T& element)//入栈 { if (m_queue1.size() > 0) { m_queue1.push_back(element); } else if (m_queue2.size() > 0) { m_queue2.push_back(element); } else { m_queue1.push_back(element); }}int main(){ CStack
myStack; myStack.mypush(1); myStack.mypush(2); myStack.mypush(3); myStack.mypop(); myStack.mypush(4); myStack.mypop(); return 0;}

 

转载于:https://www.cnblogs.com/secbook/archive/2012/08/23/2654952.html

你可能感兴趣的文章
招聘新手段:录段语音来判断求职者是否适合岗位
查看>>
倪光南:大数据安全问题重要性远超数据安全
查看>>
应对网络威胁 有望不再被动“打补丁”
查看>>
老国企如何焕发新势能?致远互联“协同五环”锻造老而弥坚
查看>>
被戴尔收购的EMC宣布明年裁员:人数未定
查看>>
物联网时代MCU 将迎来三大发展趋势
查看>>
解决最后一米信号问题飞鱼星VF-E300全新上市
查看>>
智慧城市安全问题初探
查看>>
打造NFV环境下的专属性能
查看>>
测试用例编写规范
查看>>
SWIFT系统第三家银行曝遭网络劫匪抢走1200万美元
查看>>
Java的GC机制
查看>>
espresso系列3--测试实践
查看>>
espresso基础架构与API分析
查看>>
《Python语言程序设计》——2.15 本章总结
查看>>
《音乐达人秀:Adobe Audition CC实战222例》——实例5 麦克风说话和音乐播放等所有声音都混合录制...
查看>>
TIOBE 9 月编程语言排行榜,新 TIOBE 指数算法
查看>>
《Adobe Photoshop CC经典教程》—第2课2.6节使用Spot Healing Brush工具
查看>>
《AngularJS实战》——2.3 Angular中的模板
查看>>
《Node.js区块链开发》——2.5 风险提示
查看>>