算法编程(九):最小栈

118 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

写在前面

今天的这道题,还是难度为简单等级,先刷简单,再刷中等的。

《最小栈》,题目的关键字就体现出来了,栈,接连了几个数据结构的学习,让我收获不少。

赶紧一起来看一下这道题吧。

image.png

题目解读

从题目的标题就知道是关于栈的。

从题目的描述上来看,是需要我们实现一个类的四个方法,外加一个构造函数。

其中包含了平时栈数据结构常用的push、pop、top等方法操作。

更重要的是要实现一个获取堆栈中最小元素的一个方法。

那么这个方法要通过什么方式来实现呢,我这里想到的就是通过两个队列来分别存储不同的值。

其中一个队列存储每一次进入的值,另外一个队列存储所有数据中的最小值。

代码实现

本次执行的代码如下,使用的就是上面所说的双队列的解决方案,使用这个方案可以不用太麻烦的管理这些最小值最大值了。

class MinStack {
    
    Deque<Integer> stack;
    Deque<Integer> min;

    public MinStack() {
        stack = new LinkedList<>();
        min = new LinkedList<>();
        min.push(Integer.MAX_VALUE);
    }

    public void push(int x) {
        stack.push(x);
        min.push(Math.min(min.peek(), x));
    }

    public void pop() {
        stack.pop();
        min.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return min.peek();
    }

}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

执行结果:

image.png

其他思路

我看到有些大佬竟然手写了一个栈,简直不要太厉害,大家也可以去玩一下。

总结

今天的这道题,主要就是考察对栈这个数据结构的了解,只要对栈数据结构有一定的理解,就可以完成这道题的解答了。