✅如何用队列实现一个栈?

典型回答

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

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为栈中元素的个数。

原文: https://www.yuque.com/hollis666/xkm7k3/nu9bn65b620v4gg7