Implement the following operations of a queue using stacks.
push(x) – Push element x to the back of queue.
pop() – Removes the element from in front of queue.
peek() – Get the front element.
empty() – Return whether the queue is empty.
Notes:
You must use only standard operations of a stack – which means only push to top, peek/pop from top, size, and is empty operations are valid.
Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).
题目其实相当简单,就是理解题意可能复杂点,原题就是让你用两个栈模拟一下思路就行,不需要抠那么细。
第一种思路是一个栈当队列,称为队列栈,另一个栈做中间栈。中间栈仅在 push 操作时需要用到:先把队列栈的数据全 pop 到中间栈,再把值 push 进队列栈,再把中间栈的数据 pop 回队列栈。代码如下:
class MyQueue {
Stack<Integer> stack1 = new Stack<>();
Stack<Integer> stack2 = new Stack<>();
// Push element x to the back of queue.
public void push(int x) {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
stack1.push(x);
while(!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
}
// Removes the element from in front of queue.
public void pop() {
stack1.pop();
}
// Get the front element.
public int peek() {
return stack1.peek();
}
// Return whether the queue is empty.
public boolean empty() {
return stack1.empty();
}
}
第二种思路依旧是两个栈,一个栈作为 push 栈,一个栈作为 pop栈。运算速度显然不如上面那种写法,代码如下:
class MyQueue {
Stack<Integer> pushStack = new Stack<>();
Stack<Integer> popStack = new Stack<>();
// Push element x to the back of queue.
public void push(int x) {
pushStack.push(x);
}
// Removes the element from in front of queue.
public void pop() {
if(popStack.isEmpty()) {
while(!pushStack.isEmpty()) {
popStack.push(pushStack.pop());
}
}
popStack.pop();
}
// Get the front element.
public int peek() {
if(popStack.isEmpty()) {
while(!pushStack.isEmpty()) {
popStack.push(pushStack.pop());
}
}
return popStack.peek();
}
// Return whether the queue is empty.
public boolean empty() {
return pushStack.isEmpty() && popStack.isEmpty();
}
}