Skip to content

面试速答(先看这里)

**一句话结论:**使用两个队列可以实现一个栈,一个队列用来存储栈中的元素,另一个队列用来在pop操作时暂存元素。

60秒标准回答:

使用两个队列可以实现一个栈,一个队列用来存储栈中的元素,另一个队列用来在pop操作时暂存元素

其中,push方法用来入栈,直接将元素加入queue队列中

pop方法用来出栈,先将queue队列中的元素倒入tempQueue队列中,直到queue队列中只有一个元素,将其弹出即可

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**其中,push方法用来入栈,直接将元素加入queue队列中。
  • **要点2:**pop方法用来出栈,先将queue队列中的元素倒入tempQueue队列中,直到queue队列中只有一个元素,将其弹出即可。
  • **要点3:**peek方法用来获取栈顶元素,与pop方法类似,只是在弹出元素之前需要先将其加入tempQueue队列中。
  • **要点4:**isEmpty方法用来判断栈是否为空,如果queue队列为空,则栈为空。
  • **要点5:**这个实现的时间复杂度为O(n),空间复杂度为O(n),其中n为栈中元素的个数。

**记忆锚点:**queue → pop → tempQueue → isEmpty → 另一个队列 → 一个队列

加分表达:

  • isEmpty方法用来判断栈是否为空,如果queue队列为空,则栈为空。

追问准备:

  • 围绕「queue」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「pop」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「tempQueue」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

使用两个队列可以实现一个栈,一个队列用来存储栈中的元素,另一个队列用来在pop操作时暂存元素。

plain
import java.util.LinkedList;
import java.util.Queue;

public class MyStack<T> {
    private Queue<T> queue;
    private Queue<T> tempQueue;

    public MyStack() {
        queue = new LinkedList<>();
        tempQueue = new LinkedList<>();
    }

    public void push(T element) {
        queue.offer(element);
    }

    public T pop() {
        if (isEmpty()) {
            throw new RuntimeException("Stack is empty");
        }
        while (queue.size() > 1) {
            tempQueue.offer(queue.poll());
        }
        T element = queue.poll();
        Queue<T> temp = queue;
        queue = tempQueue;
        tempQueue = temp;
        return element;
    }

    public T peek() {
        if (isEmpty()) {
            throw new RuntimeException("Stack is empty");
        }
        while (queue.size() > 1) {
            tempQueue.offer(queue.poll());
        }
        T element = queue.poll();
        tempQueue.offer(element);
        Queue<T> temp = queue;
        queue = tempQueue;
        tempQueue = temp;
        return element;
    }

    public boolean isEmpty() {
        return queue.isEmpty();
    }
}

其中,push方法用来入栈,直接将元素加入queue队列中。

pop方法用来出栈,先将queue队列中的元素倒入tempQueue队列中,直到queue队列中只有一个元素,将其弹出即可。

peek方法用来获取栈顶元素,与pop方法类似,只是在弹出元素之前需要先将其加入tempQueue队列中。

isEmpty方法用来判断栈是否为空,如果queue队列为空,则栈为空。

这个实现的时间复杂度为O(n),空间复杂度为O(n),其中n为栈中元素的个数。