剑指offer 编程题(5):两个栈实现队列,两个队列实现栈
来源:互联网 发布:windows xp主题下载 编辑:程序博客网 时间:2024/06/06 20:17
问题1:用两个栈实现一个队列,实现队列的push和delete操作
栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO),在实现delete时,我们的难点是如何将栈中最底层的数据拿出来,我们有两个栈,所以我们可以将一个栈中的数据依次拿出来压入到另一个为空的栈,另一个栈中数据的顺序恰好是先压入栈1的元素此时在栈2的上面,为了实现效率的提升,我们在delete时,判断栈2是否有数据,如果有的话,直接删除栈顶元素,在栈2为空时才将栈1的数据压入到栈2中,从而提高程序的运行效率,实现过程可以分为下面几个步骤:
1、push操作时,一直将数据压入到栈2中
2、delete操作时,首先判断栈2是否为空,不为空的情况直接删除栈2栈顶元素,为空的话将栈1的数据压入到栈2中,再将栈2栈顶元素删除。
实现代码如下:
template <typename T>class CQueue{public: CQueue(void) {} ~CQueue(void) {} void appendTail(const T& node); T deleteHead();private: stack<T> stack1; stack<T> stack2;};template<class T>void CQueue<T>::appendTail(const T& node)//在队列尾部添加数据{ stack1.push(node);}template<class T>T CQueue<T>::deleteHead(){ T tmp = 0; if (stack2.empty()) //若栈2为空 { while (!stack1.empty()) { tmp = stack1.top(); stack2.push(tmp); stack1.pop(); } } tmp = stack2.top(); stack2.pop(); return tmp;}
问题2:用两个队列实现一个栈
因为队列是先进先出,所以要拿到队列中最后压入的数据,只能每次将队列中数据pop到只剩一个,此时这个数据为最后压入队列的数据,在每次pop时,将数据压入到另一个队列中。每次执行delete操作时,循环往复。(感觉效率低)每次删除时间复杂度O(N)
代码如下:
template <typename T>class CStack{public: CStack(void) {} ~CStack(void) {} void appendTail(const T& node); T deleteHead();private: queue<T> q1; queue<T> q2;};template<class T>void CStack<T>::appendTail(const T& node)//在栈尾部添加数据{ if (!q1.empty())//不为空的执行push操作 { q1.push(node); } else { q2.push(node); }}template<class T>T CStack<T>::deleteHead(){ int ret = 0; if (q1.empty()) { int i = q2.size(); while (i > 1 )//将q2队列中的数据pop到只剩一个 { q1.push(q2.front()); q2.pop(); --i; } ret = q2.front(); q2.pop(); } else { int i = q1.size(); while (i > 1) { q2.push(q1.front()); q1.pop(); --i; } ret = q1.front(); q1.pop(); } return ret;
用两个栈实现一个队列的功能?要求给出算法和思路!
<分析>:
入队:将元素进栈A
出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;
如果不为空,栈B直接出栈。
用两个队列实现一个栈的功能?要求给出算法和思路!
<分析>:
入栈:将元素进队列A
出栈:判断队列A中元素的个数是否为1,如果等于1,则出队列,否则将队列A中的元素 以此出队列并放入队列B,直到队列A中的元素留下一个,然后队列A出队列,再把 队列B中的元素出队列以此放入队列A中。
- 剑指offer 编程题(5):两个栈实现队列,两个队列实现栈
- 剑指offer 编程题(5):两个栈实现队列,两个队列实现栈
- 剑指offer(5)-用两个栈实现队列
- 剑指offer--(5) 用两个栈实现队列
- [剑指offer]用两个栈实现队列
- 【剑指offer】两个栈实现一个队列
- 【剑指offer】两个队列实现一个栈
- 【剑指offer】用两个栈实现队列
- 剑指offer--用两个栈实现队列
- 剑指offer 两个栈实现队列
- 剑指Offer-用两个栈实现队列
- 剑指offer:用两个栈实现队列
- 《剑指offer》用两个栈实现队列
- 用两个栈实现队列(剑指offer)
- 剑指 offer:用两个栈实现队列
- 【剑指Offer】用两个栈实现队列
- 剑指offer-用两个栈实现队列
- 《剑指offer》-用两个栈实现队列
- 知乎回答——闲
- Python基础篇之类的继承
- Android Framework------之PowerManagerService的功能
- openGL 顶点,坐标系,纹理坐标
- 一名前端工程师的自学之路!Js篇(12-14更新)
- 剑指offer 编程题(5):两个栈实现队列,两个队列实现栈
- linux下SVN 服务搭建
- 网卡类WiFi模块系列一:USB接口单频单通道WiFi模块
- mfc 的 clistctrl 显示item的最大长度
- iOS OpenGL 纹理坐标详解
- 在齐次方程组中为什么当系数矩阵的秩r比n小时,方程组的基础解系有(n-r) 个?
- Sudoku Killer HDU
- 单例模式再看
- SpringMVC中的@RequestMapping