【100题】第五十七题 用两个栈实现队列
来源:互联网 发布:数控车床编程图文实例 编辑:程序博客网 时间:2024/05/16 15:20
一,题目
某队列的声明如下:
template<typename T> 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<typename T> void CQueue<T>::appendTail(const T& element)//入队 { m_stack1.push(element);}template<typename T> void CQueue<T>::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 <iostream>#include <stack>#include <assert.h>using namespace std;// 两个队列实现一个栈template<typename T> class CStack{public: CStack() {} ~CStack() {} void mypush(const T& element); void mypop(); private: deque <T> m_queue1; deque <T> m_queue2;};template<typename T> void CStack<T>::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<typename T> void CStack<T>::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<int> myStack; myStack.mypush(1); myStack.mypush(2); myStack.mypush(3); myStack.mypop(); myStack.mypush(4); myStack.mypop(); return 0;}
- 【100题】第五十七题 用两个栈实现队列
- 用两个栈实现队列 【微软面试100题 第五十七题】
- 第五十七题(用俩个栈实现队列)
- 剑指offer第五题【用两个栈实现队列】c++实现
- 笔试题:用两个栈实现队列
- [算法题]用两个栈实现队列
- 第七题 用两个栈实现队列
- 程序员面试题精选100题(18)-用两个栈实现队列以及用两个队列实现栈
- 简单题_用两个栈实现队列和用两个队列实现一个栈
- 算法题:两个栈实现一个队列
- 算法题/两个栈实现队列
- 算法题/两个队列实现栈
- 微软100题(57)两个栈实现队列
- 用两个栈实现队列 & 用两个队列实现栈
- 用两个队列实现栈&用两个栈实现队列
- 用两个栈实现队列 & 两个队列实现一个栈
- 两个栈实现队列&&用两个队列实现一个栈
- 用两个栈实现队列 & 两个队列实现栈
- 排序算法之四 Shell排序
- 页面乱码问题根源浅析
- 学生管理系统之添加数据
- 实习第46天
- ireport开发系列(一)
- 【100题】第五十七题 用两个栈实现队列
- 正则表达式备忘笔记
- oracle多表查询留言人(日志人、日志内容、日志留言人)
- android带返回按钮的自定义标题栏
- 如何修改PPT表格的边框颜色
- Android ApiDemos示例解析(134):Views->Layouts->Baseline->2. Bottom
- 2012谷歌浏览器的逆袭
- C# 常用正则表达式
- Android ApiDemos示例解析(135):Views->Layouts->Baseline->3. Center