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).
这道题是让你用队列来实现栈的功能。
第一种思路:
首先要了解栈的特点:先进后出,队列特点:先进先出。
对于进栈的操作来说,我们可以不用考虑那么多,直接加入队列即可。
那么如果我们要用队列来实现栈,首先要明确的是因为队列的先进先出,所以栈弹出的那个元素就是我们队列最后一个元素。
明白这一点后,接下来要考虑的是怎样维持队列的完整性。因为要取得队列的最后一个元素,我们必然需要把最后一个之前的元素全部pop出队列,这样队列就只剩一个元素,栈的完整性就被破坏了。此时可以考虑的是怎样把那些pop掉的元素弄回到队列里。
一种方法是把这些pop掉的元素再push回队列内,这样我们就可以保留完整性。
还有一种方法是实例化第二个队列,然后把这些元素放到第二个队列里,但这里有一个问题,因为我们的栈是以第一个队列为基准的,所以最后要进行一步两个队列swap的操作,这样就能让栈始终是第一个队列。
class MyStack {
private Queue<Integer> q1 = new LinkedList<Integer>();
private Queue<Integer> q2 = new LinkedList<Integer>();
// Push element x onto stack.
public void push(int x) {
q1.offer(x);
}
// Removes the element on top of the stack.
public void pop() {
while(q1.size()>1){
q2.offer(q1.poll());
}
q1.poll();
Queue temp = q1;
q1=q2;
q2=temp;
}
// Get the top element.
public int top() {
while(q1.size()>1){
q2.offer(q1.poll());
}
int top = q1.peek();
q2.offer(q1.poll());
Queue temp = q1;
q1=q2;
q2=temp;
return top;
}
// Return whether the stack is empty.
public boolean empty() {
return q1.isEmpty();
}
}