编写一个类,用栈来实现一个队列,支持队列的基本操作(push,pop,peek,empty)。
原题目:LeetCode-232. Implement Queue using Stacks
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.
Example:
MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // returns 1 queue.pop(); // returns 1 queue.empty(); // returns false
Notes:
- You must use only standard operations of a stack -- which means only
push to top
,peek/pop from top
,size
, andis 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).
设计思路:栈是先进后出的数据结构,而队列是先进先出的队列结构,所以显然用一个栈是不能满足要求的。如果我们将一个栈内的所有元素都在压入到另外一个新栈中,新栈中的栈顶元素就是旧栈中最先被压入的元素了,此时从新栈中弹出元素就满足队列的先进先出的定义了。所以我们这里使用两个栈,一个栈(stackPush)专门压入元素,一个栈(stackPop)专门弹出元素,当stackPop为空时,就将stackPush栈中的所有元素压入到stackPop栈中。
下面看实现代码(AC):
class MyQueue {
private ArrayDeque<Integer> stackPush;
private ArrayDeque<Integer> stackPop;
private void transferData() {
while (!stackPush.isEmpty()) {
stackPop.push(stackPush.pop());
}
}
/** Initialize your data structure here. */
public MyQueue() {
stackPush = new ArrayDeque<>();
stackPop = new ArrayDeque<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
stackPush.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if (stackPop.isEmpty()) {
transferData();
}
return stackPop.pop();
}
/** Get the front element. */
public int peek() {
if (stackPop.isEmpty()) {
transferData();
}
return stackPop.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return stackPush.isEmpty() && stackPop.isEmpty();
}
}
我们下期见!