使用栈实现队列的下列操作:
- push(x) – 将一个元素放入队列的尾部。
- pop() – 从队列首部移除元素。
- peek() – 返回队列首部的元素。
- empty() – 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
- 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
- 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
思路
1.创建两个栈,一个用于输入,一个用于输入。输入的栈负责队列的push进来的数据。当队列需要pop或者peek时, 需要把输入栈的内容进入输出栈,再在输出栈中执行pop或者peek,当输出栈中还有值时就不要将输入栈的内容进入输出栈。
public class MyQueue {
//输入栈
private Stack<Integer> inputStack;
//输出栈
private Stack<Integer> outputStack;
public MyQueue() {
inputStack = new Stack<>();
outputStack = new Stack<>();
}
public void push(int x) {
inputStack.push(x);
}
public int pop() {
//如果输出栈为空,则将输入栈中元素全部转给输入栈中
if (outputStack.isEmpty()) {
while (!inputStack.isEmpty()) {
outputStack.push(inputStack.pop());
}
}
return outputStack.pop();
}
public int peek() {
if (outputStack.isEmpty()) {
while (!inputStack.isEmpty()) {
outputStack.push(inputStack.pop());
}
}
return outputStack.peek();
}
public boolean empty() {
return inputStack.isEmpty() && outputStack.isEmpty();
}
}
扩展
用队列实现栈
1.创建两个队列,输入队列和输出队列。输入队列用于push操作。push时将输出队列的数据放入到输入队列这样就达到了数据颠倒,然后将交换输入队列和输出队列。
class MyStack {
//输入队列
private Queue<Integer> inputQueue;
//输出队列
private Queue<Integer> outputQueue;
public MyStack() {
inputQueue = new LinkedList<>();
outputQueue = new LinkedList<>();
}
public void push(int x) {
inputQueue.offer(x);
//将输出队列中元素全部转给输入队列
while (!outputQueue.isEmpty()) {
inputQueue.offer(outputQueue.poll());
}
//交换输入队列和输出队列,是的输入队列在push的时候始终为空队列
Queue<Integer> temp = inputQueue;
inputQueue = outputQueue;
outputQueue = temp;
}
public int pop() {
return outputQueue.poll();
}
public int top() {
return outputQueue.peek();
}
public boolean empty() {
return outputQueue.isEmpty();
}
}