链接:https://leetcode.com/problems/implement-stack-using-queues/
思路:用一个队列来存元素,难点在于pop的时候要的是队尾的元素,而队列只能从队首出元素 We use a queue to store elements. The hard point is that when we use pop method, we want to access the queue rear, but we can only pop an element from the queue front.
- Approach 1: 用两个队列,pop的时候,将队尾以外部分暂存到q2,取出队尾x,再将q2放回q1。When popping, q2 acts as a temporary storage for q1 except q1 rear.
- Approach 2: 只用一个队列,pop的时候,将队尾以外的部分出队再入队,相当于将队尾平移到队首。When popping, we dequeue an element from q1 front, and enqueue it to q1 rear, until the former rear comes to the front.
class MyStack {
private:
queue<int> q1, q2; // q1 is main, q2 acts as a buffer
int topE;
public:
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
q1.push(x);
topE = x;
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
// q1除队尾暂存到q2,取出队尾x,就是要返回的值
while(q1.size() != 1) {
q2.push(q1.front());
q1.pop();
}
int x = q1.front();
q1.pop();
// 将q2放回q1,更新topE
int newTop;
while(!q2.empty()) {
newTop = q2.front();
q1.push(newTop);
q2.pop();
}
topE = newTop;
return x;
}
/** Get the top element. */
int top() {
return topE;
}
/** Returns whether the stack is empty. */
bool empty() {
return q1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/