思路:
为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中 a 作为输入队列,b 作为输出队列。
入栈操作时,首先将元素入队到 a 中,若 b 为空,则将 a 和 b 互换;若 b 不为空,则将b的全部元素依次出队并入队到 a 中,此时,b 为空,则将 a 和 b 互换,此时 b 的前端的元素即为新入栈的元素。
由于每次入栈操作都确保b的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除 b 的前端元素并返回即可,获得栈顶元素操作只需要获得 b 的前端元素并返回即可(不移除元素)。
由于 b 用于存储栈内的元素,判断栈是否为空时,只需要判断 b是否为空即可。
图解演示:
1.队列模拟栈入栈操作
2.队列模拟栈出栈操作
代码实现:
class MyStack {
private Queue<Integer> a;//输入队列
private Queue<Integer> b;//输出队列
public MyStack() {
a = new LinkedList<>();
b = new LinkedList<>();
}
public void push(int x) {
a.offer(x);
// 将b队列中元素全部转给a队列
while(!b.isEmpty()){
a.offer(b.poll());
}
// 交换a和b,使得a队列没有在push()的时候始终为空队列
Queue t = a;
a = b;
b = t;
}
public int pop() {
return b.poll();
}
public int top() {
return b.peek();
}
public boolean empty() {
return b.isEmpty();
}
}
【注】此题与 栈与队列-用栈实现队列 一起学习效果更佳。