用两个栈实现一个队列的功能。
解题思路
假设两个栈A和B,且都为空。
栈A提供
push()
功能,栈B提供pop()
功能。 - 入队列:入栈A。
- 出队列:
- 假设栈B不为空。直接弹出B的元素。
- 假设栈B为空,则依次弹出栈A的元素并压入栈B中,再弹出B中的元素。
实现代码
#include#include using namespace std;template class MyQueue{public: void push(const T& t) { s1.push(t); } void pop() { if (s2.empty()) { while (!s1.empty()) { s2.push(s1.top()); s1.pop(); } } s2.pop(); } T& top() { if (s2.empty()) { while (!s1.empty()) { s2.push(s1.top()); s1.pop(); } } return s2.top(); } bool empty() const { return s1.empty() && s2.empty(); }private: stack s1; stack s2;};int main(){ MyQueue myque; for (int i = 0; i < 10; i++) { myque.push(i); } while (!myque.empty()) { cout< <<" "; myque.pop(); }}
注意:pop()
和top()
中没有再加上if (!s2.empty())
的推断,我觉得此处应该由使用者来推断MyQueue
对象是否为空。降低一些不必要的推断能够提高程序效率。