Leetcode 225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x)将元素 x 压入栈顶。int pop()移除并返回栈顶元素。int top()返回栈顶元素。boolean empty()如果栈是空的,返回true;否则,返回false。
注意:
- 你只能使用队列的标准操作 —— 也就是
push to back、peek/pop from front、size和is empty这些操作。 - 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
解题思路:
当使用两个队列实现栈时,主要的思路是在 push 操作中将新元素放在队列的头部,以实现后入先出(LIFO)的特性。以下是详细的解题思路:
- 定义两个队列
queue1和queue2,其中queue1是主队列用于存储栈中的元素,queue2是辅助队列用于在 push 操作中临时存储元素。 - 在构造函数
MyStack()中,初始化两个队列,即queue1和queue2。 - 在
push操作中,首先将queue1中的所有元素移到queue2,以保证新元素可以添加到队列的头部。然后将新元素x添加到queue1。最后,将queue2中的所有元素移回queue1,确保栈中的元素顺序不变。 - 在
pop操作中,直接从queue1中移除并返回头部元素,即栈顶元素。 - 在
top操作中,返回queue1的头部元素,即栈顶元素。 - 在
empty操作中,判断queue1和queue2是否都为空。如果两个队列都为空,说明栈中没有元素,返回 true;否则,返回 false。
代码实现:
class MyStack {
// 主队列,用于存储栈中的元素
Deque<Integer> queue1;
// 辅助队列,用于在 push 操作中临时存储元素
Deque<Integer> queue2;
public MyStack() {
queue1 = new LinkedList();
queue2 = new LinkedList();
}
public void push(int x) {
while (!queue1.isEmpty()) {
// 将 queue1 中的元素移到 queue2
queue2.add(queue1.poll());
}
// 将新元素添加到 queue1
queue1.add(x);
while (!queue2.isEmpty()) {
// 将 queue2 中的元素移到 queue1
queue1.add(queue2.poll());
}
}
public int pop() {
// 直接从 queue1 中移除并返回栈顶元素
return queue1.poll();
}
public int top() {
// 返回 queue1 的头部元素,即栈顶元素
return queue1.peek();
}
public boolean empty() {
// 判断栈是否为空
return queue1.isEmpty() && queue2.isEmpty();
}
}
评论区