47. 腾讯面试题: 用两个栈实现队列
来源:互联网 发布:软件系统安全保密设计 编辑:程序博客网 时间:2024/06/15 14:29
题目:某队列的声明如下:
template<typename T, int MAXSIZE>class Stack;template<typename T>class CQueue{public: CQueue(){} ~CQueue(){} void appendTail(const T& node); void deleteHead(); void pop(T& node);private: Stack<T, 1024> m_stack1; Stack<T, 1024> m_stack2;};分析:
从上面队列的声明,可以看出队列CQueue实现是使用两个栈m_stack1和m_stack2,
一个栈用于插入数据:
m_stack1.push(data)
如插入数据:1,2,3,4,5,6
一个栈用于取数据:
这时可以把m_stack1里面的内容放入到m_stack2中,这样插入m_stack2的顺序为:
6,5,4,3,2,1
这样 m_stack2.pop() 是不是就是 1,2,3,4,5了。
看看直观的图如下:
实现如下:
#include<stdio.h>#include<string.h>#include<iostream>#include<stdlib.h>using namespace std;template<typename T, int MAXSIZE>class Stack;template<typename T>class CQueue{public: CQueue(){} ~CQueue(){} void appendTail(const T& node); void deleteHead(); void pop(T& node);private: Stack<T, 1024> m_stack1; Stack<T, 1024> m_stack2;};template<typename T, int MAXSIZE=1024>class Stack{private: T data[MAXSIZE]; int pos;public: Stack():pos(0){} bool empty() { return pos == 0; } bool full() { return pos == MAXSIZE; } bool get(T& _value) { if(empty()) return false; _value = data[pos-1]; return true; } bool pop(T& _value) { { if(empty()) return false; _value = data[--pos]; return true; } bool push(const T& _value) { if(full()) return false; data[pos] = _value; pos ++; return true; }};template <typename T> void CQueue<T>::appendTail(const T& node){ //if(!m_stack1.full()) m_stack1.push(node);//这有个问题:这个队列顶多只有1024个空间,实际队列可存储的空间最多为2048,没能很好的利用空间<span style="white-space:pre">if(m_stack1.full()) //如果m_stack1满了,判断下m_stack2是否为空,如果为空,则把m_stack1的内容插入到 m_stack2中,>否则插入失败。 { if(!m_stack2.empty()) return; T node1; while(!m_stack1.empty()) { m_stack1.pop(node1); m_stack2.push(node1); } } m_stack1.push(node);</span><span style="white-space:pre"></span>}template <typename T>void CQueue<T>::deleteHead(){ T _node; if(m_stack2.empty()) { while(!m_stack1.empty()) { m_stack1.pop(_node); m_stack2.push(_node); } } m_stack2.pop(_node);}template <typename T>void CQueue<T>::pop(T&node){ if(m_stack2.empty()) { T _node; while(!m_stack1.empty()) { m_stack1.pop(_node); m_stack2.push(_node); } } m_stack2.pop(node);}int main(){ CQueue<int> q; int i = 1; cout << "insert queue: " << endl; while(i < 10)// { cout << i << ","; q.appendTail(i++); } cout << endl << "pop queue: " << endl; while( i> 1) { int k = -1; q.pop(k); cout << k << ","; i --; } return 0;}
输出结果为:insert queue:
1,2,3,4,5,6,7,8,9,
pop queue:
1,2,3,4,5,6,7,8,9,
0 0
- 47. 腾讯面试题: 用两个栈实现队列
- 面试题整理-两个栈实现队列
- 面试题7 两个栈实现队列
- 面试题-----两个栈实现一个队列
- 面试题 两个队列实现栈
- 面试题13 - 用两个栈实现队列 【栈】
- 面试题--用两个栈实现一个队列
- 面试题研究 用两个栈模拟实现队列
- 剑指offer-->面试题7 用两个栈实现队列
- 经典面试题一:用两个栈实现一个队列
- 面试题7:用两个栈实现队列
- 面试题6:用两个栈实现队列
- 面试题7:用两个队列实现栈
- [剑指offer][面试题07]用两个栈实现队列
- 《剑指Offer》面试题-用两个栈实现队列
- 《剑指offer》面试题七 用两个栈实现队列
- 面试题7 用两个栈实现队列
- 面试题 用两个栈实现一个队列
- cout 格式化
- 遍身罗绮者 不是养蚕人
- (截选)调用.app获取 返回的结果
- 临时变量理解
- vmware 联网。。。
- 47. 腾讯面试题: 用两个栈实现队列
- 牢骚话
- 黑马程序员--7K面试:交通灯系统
- 编译ios版本的librtmp+openssl
- ORACLE11.2.0 SQLPLUS 报 error while loading shared libraries
- java实现生产消费者问题
- spket安装与配置
- 网易云音乐(2)————加载失败的原因
- 局域网文件共享的几种方法