Implement the following operations of a stack using queues.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- empty() -- Return whether the stack is empty.
- You must use only standard operations of a queue -- which means only
push to back
,peek/pop from front
,size
, andis empty
operations are valid. - Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue.
- You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).
两个队列,永远有一个为空,插入时,插入到不为空的队列中,如果都为空则任意;弹出时,把不为空队列中的所有元素(最后一个除外)转移到另一队列当中,并将最后一个不插入,直接删除即可。如果两个队列均为空,则说明栈为空。
class Stack { public: // Push element x onto stack. void push(int x) {//在非空队列中插入 if (aqueue.empty()) bqueue.push(x); else aqueue.push(x); } // Removes the element on top of the stack. void pop() { if (aqueue.empty()) {//转移 while (bqueue.size() != 1) { int tmp = bqueue.front(); aqueue.push(tmp); bqueue.pop(); } bqueue.pop(); } else { while (aqueue.size() != 1) { int tmp = aqueue.front(); bqueue.push(tmp); aqueue.pop(); } aqueue.pop(); } } // Get the top element. int top() { int tmp; if (aqueue.empty()) { while (!bqueue.empty()) { tmp= bqueue.front(); aqueue.push(tmp); bqueue.pop(); } } else { while (!aqueue.empty()) { tmp = aqueue.front(); bqueue.push(tmp); aqueue.pop(); } } return tmp; } // Return whether the stack is empty. bool empty() { return (aqueue.empty() && bqueue.empty()); } private: queue<int> aqueue; queue<int> bqueue; };