利用两个栈来实现一个队列, 这个问题非经常见。 最关键的是要有好的思路, 至于实现, 那是非常easy的事情了。 在本文中, 也想说说自己的思路, 可是。 我认为用代码来表述思路更符合我的习惯。 也是我的菜, 所以, 只给出代码。 如有须要。 大家能够依据代码来理解思路。
OK, 没有必要废话了, 直接上代码:
#include <iostream> #include <stack> using namespace std; // 用两个stack实现一个queue, 以int类型为例吧 class MyQueque { private: stack<int> s1; // s1负责入队 stack<int> s2; // s2负责出队 public: // 入队 void push(int x) { s1.push(x); } // 出队 void pop() { if(!s2.empty()) { s2.pop(); } else { while(!s1.empty()) { int tmp = s1.top(); s1.pop(); s2.push(tmp); } s2.pop(); } } // 取头 int front() { if(!s2.empty()) { return s2.top(); } while(!s1.empty()) { int tmp = s1.top(); s1.pop(); s2.push(tmp); } return s2.top(); } // 取尾 int back() { if(!s1.empty()) { return s1.top(); } while(!s2.empty()) { int tmp = s2.top(); s2.pop(); s1.push(tmp); } return s1.top(); } // 求大小 int size() { return s1.size() + s2.size(); } // 推断是否为空 bool empty() { if(s1.empty() && s2.empty()) { return true; } return false; } }; int main() { { MyQueque que; que.push(1); que.push(2); que.push(3); que.push(4); que.push(5); while(!que.empty()) { cout << que.front() << endl; que.pop(); } cout << "-------------------" << endl; } { MyQueque que; que.push(1); que.push(2); que.push(3); que.push(4); que.push(5); while(!que.empty()) { cout << que.size() << endl; que.pop(); } cout << "-------------------" << endl; } { MyQueque que; que.push(1); que.push(2); que.push(3); que.pop(); que.pop(); que.push(4); que.push(5); while(!que.empty()) { cout << que.front() << endl; que.pop(); } cout << "-------------------" << endl; } return 0; }结果:
1
2
3
4
5
-------------------
5
4
3
2
1
-------------------
3
4
5
-------------------
我写完上述代码后, 简单走读了一下代码, 并測试了一下, 初步发现还OK, 假设大家发现有什么问题。 欢迎指出, 在此,先感谢一下。