一则有趣的算法题:两个栈实现一个队列

76 阅读1分钟

题目:如题,就是用两个栈实现队列的特性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPzXVXe4-1626583202478)(C:\Users\17122\AppData\Roaming\Typora\typora-user-images\image-20210718114337302.png)]

1 基本架构

首先我们声明两个栈和自定义队列的基本结构、功能

static class MyQueue<E> {
    /**
     * 首先声明两个栈
     */
    public Stack stack1 = new Stack<E>();

    public Stack stack2 = new Stack<E>();

    /**
     * 添加操作
     * @param e
     */
    public void push(E e) {
    }

    /**
     * 弹出操作
     * @return
     */
    public E pop() {
        return (E) stack2.pop();
    }

}

2 实现思路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4W7pXufq-1626583202480)(一则有趣的算法题:两个栈实现一个队列.assets/image-20210718123019814.png)]

3 具体实现

接下来我们按步骤进行编码

static class MyQueue<E> {
    /**
     * 首先声明两个栈
     */
    public Stack stack1 = new Stack<E>();

    public Stack stack2 = new Stack<E>();

    /**
     * 添加操作
     *
     * @param e
     */
    public void push(E e) {
        //将元素压入stack1
        stack1.push(e);
    }

    /**
     * 弹出操作
     *
     * @return
     */
    public E pop() {
        //如果stack2为空,将stack1元素全部放入stack2
        if (stack2.isEmpty()) {
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
            //如果不为空,直接弹出
        } else {
            return (E) stack2.pop();
        }
        //全部为空时抛出异常
        if (stack1.isEmpty() && stack2.isEmpty()) {
            throw new NoSuchElementException();
        }
        return (E) stack2.pop();
    }
}

4 测试

public static void main(String[] args) {
    MyQueue<Integer> queue = new MyQueue<>();
    queue.push(1);
    queue.push(2);
    queue.push(3);
    System.out.println(queue.pop());
    System.out.println(queue.pop());
    queue.push(4);
    queue.push(5);
    System.out.println(queue.pop());
}

运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pf4bEF5A-1626583202482)(一则有趣的算法题:两个栈实现一个队列.assets/image-20210718123830484.png)]
测试结果是严格按照先进先出来执行