两个栈实现一个队列
- push:直接push进stIn
pop:
- 如果stOut不为空,直接pop
如果stOut为空,先将stIn中所有元素push进stIn,再pop
// push的时候直接push进st1,pop的时候如果st2不为空,直接出栈;如果st1为空,将st1的元素全部push进st2后,再出栈。class CQueue {public:CQueue() {}void appendTail(int value) {stIn.push(value);}int deleteHead() {if (stOut.empty()) {if (stIn.empty()) return -1;while (!stIn.empty()) {stOut.push(stIn.top());stIn.pop();}}int num = stOut.top();stOut.pop();return num;}int top() {int num = deleteHead(); // 代码复用stOut.push(num);return num;}int empty() {return (stIn.empty() && stOut.empty());}private:stack<int> stIn;stack<int> stOut;};
队列实现栈
pop实现,将队列队首的元素一个个弹出重新放入队列的队尾,只留下原来队列中的最后一个元素弹出
push就是直接将元素插入队尾class MyStack { public: MyStack() { } void push(int x) { que.push(x); } int pop() { if (que.empty()) return -1; int cnt = que.size() - 1; while (cnt--) { que.push(que.front()); que.pop(); } int res = que.front(); que.pop(); return res; } int top() { int res = pop(); que.push(res); return res; } bool empty() { return que.empty(); } queue<int> que; };
