使用队列实现栈的下列操作:
- push(x) -- 元素 x 入栈
- pop() -- 移除栈顶元素
- top() -- 获取栈顶元素
- empty() -- 返回栈是否为空
注意:
- 你只能使用队列的基本操作-- 也就是
push to back,peek/pop from front,size, 和is empty这些操作是合法的。 - 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
- 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
题解
class MyStack {
private Queue<Integer> queue;
private Queue<Integer> reverseQueue;
/**
* Initialize your data structure here.
*/
public MyStack() {
queue = new LinkedList<>();
reverseQueue = new LinkedList<>();
}
/**
* Push element x onto stack.
*/
public void push(int x) {
reverseQueue.offer(x);
while (!queue.isEmpty()) {
reverseQueue.offer(queue.poll());
}
Queue temp = queue;
queue = reverseQueue;
reverseQueue = temp;
}
/**
* Removes the element on top of the stack and returns that element.
*/
public int pop() {
return queue.poll();
}
/**
* Get the top element.
*/
public int top() {
return queue.peek();
}
/**
* Returns whether the stack is empty.
*/
public boolean empty() {
return queue.isEmpty();
}
}
使用两个单向队列,每次push时,先将该值加入到reverseQueue中,将queue中所有元素压入到reverseQueue中,然后交换reverseQueue和queue。
1. push(1)
reverseQueue:[1] queue:[]
reverseQueue:[] queue:[1]
2. push(2)
2.1 reverseQueue:[2] queue:[1]
2.2 reverseQueue:[2,1] queue:[]
2.3 reverseQueue:[] queue:[2,1]
3. push(3)
2.1 reverseQueue[3] queue:[2,1]
2.2 reverseQueue:[3,2,1] queue:[]
2.3 reverseQueue:[] queue:[3,2,1]
4. top()
3
5. pop()
3 此时 reverseQueue:[] queue:[2,1]