实现方法 2:一个队列实现栈
那我们可以不可以用一个队列来实现栈呢?答案是肯定的。
我们只需要执行以下两个步骤就可以实现将队列转换为栈了,具体实现步骤如下:
- 将元素入列到队尾;
- 再将除队尾之外的所有元素移除并重写入列。
这样操作之后,最后进入的队尾元素反而变成了队头元素,也就实现了后进先出的功能了,如下图所示。
步骤一
元素 1 入列:
步骤二
元素 2 入列:
步骤三
将最后一个元素之前的所有元素,也就是元素 1,出列重新入列:
步骤四
执行出队操作:
最终效果
以上思路的实现代码如下:
import java.util.Queue; class MyStack { Queue<Integer> queue1; public MyStack() { queue1 = new LinkedBlockingQueue(); } /** * 入栈 */ public void push(int x) { // 获取原队列长度(要移动的次数) int count = queue1.size(); // 将元素放入队尾 queue1.offer(x); // 将除最后一个元素外,其他的元素重新入队 for (int i = 0; i < count; i++) { System.out.println("for"); queue1.offer(queue1.poll()); } } /** * 出栈并返回此元素 */ public int pop() { return queue1.poll(); } /** * 查询栈顶元素 */ public int top() { return queue1.peek(); } /** * 判断是否为空 */ public boolean empty() { return queue1.isEmpty(); } }
我们把以上代码在 LeetCode 中提交,执行结果如下:
此方法依旧很稳,也是同样的击败了 100% 的用户,只不过此方法在内存方面有更好的表现。