再将 queue1 和 queue2 进行互换:
执行出队操作:
最终效果
从最终的效果图我们可以看出,通过两个队列已经实现了后进先出的特性,也就是完成了从队列到栈的转换,实现代码如下: import java.util.Queue; class MyStack { Queue<Integer> queue1; Queue<Integer> queue2; public MyStack() { queue1 = new LinkedBlockingQueue(); queue2 = new LinkedBlockingQueue(); } /** * 入栈 */ public void push(int x) { // 1.入列临时队列二 queue2.offer(x); // 2.将队列一的所有元素移动到队列二 while (!queue1.isEmpty()) { queue2.offer(queue1.poll()); } // 3.队列一和队列二互换 Queue<Integer> temp = queue1; queue1 = queue2; queue2 = temp; } /** * 出栈并返回此元素 */ public int pop() { return queue1.poll(); } /** * 查询栈顶元素 */ public int top() { return queue1.peek(); } /** * 判断是否为空 */ public boolean empty() { return queue1.isEmpty(); } }
我们在 LeetCode 中提交以上测试代码,执行结果如下:
此方法很稳,竟然击败了 100% 的用户。
实现方法 2:一个队列实现栈那我们可以不可以用一个队列来实现栈呢?答案是肯定的。
我们只需要执行以下两个步骤就可以实现将队列转换为栈了,具体实现步骤如下:
将元素入列到队尾;
再将除队尾之外的所有元素移除并重写入列。
这样操作之后,最后进入的队尾元素反而变成了队头元素,也就实现了后进先出的功能了,如下图所示。
步骤一元素 1 入列:
元素 2 入列:
将最后一个元素之前的所有元素,也就是元素 1,出列重新入列:
步骤四