前端算法-设计最小栈

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

题目

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

思路

我们先创建一个Node构造函数,这个构造函数中包含了val值和min值,min值是当前栈中的最小值,我们在创建一个MinStack构造函数,这个构造函数里面有stack值,它是一个空数组,在MinStack的prototype原型上我们挂载上四个方法,分别是push方法,pop方法,top方法,getMin方法,我们每次调用push方法,先去创建一个node变量,它的值是通过new关键字创建Node构造函数的实例,然后判断当前MinStack的stack的长度是不是等于0,如果等于0,则将当前node变量的min值重新赋值为当前的val,如果不满足,则判断当前stack数组最后值的min值是否大于val值,如果大于则将当前val值重新赋值给node实例的min值,如果还不满足则直接将当前stack数组最后值的min值赋值给node实例,然后再使用push方法把当前node实例添加到stack数组中,每次调用pop方法时我们先判断当前stack数组长度是否为0,如果为0则直接return,如果不为0则对stack数组使用pop方法,每次调用top方法时,也需要判断stack数组的长度进行判断是否return,如果不return则将当前stack数组中最后一个值的val属性值返回出去,每次调用getMin方法时,依照之前的判断stack数组长度,然后进行将当前stack数组最后一个值的min属性值返回出去即可,这样就完成了一个设计最小栈的操作

const Node = function(val) {
    this.val = val;
    this.min = 0;
};
let MinStack = function() {
    this.stack = [];
};
MinStack.prototype.push = function(val) {
    let node = new Node(val);
    if (this.stack.length==0) {
        node.min = val;
    } else if (this.stack[this.stack.length - 1].min > val) {
        node.min = val;
    } else {
        node.min = this.stack[this.stack.length - 1].min;
    }
    this.stack.push(node);
};
MinStack.prototype.pop = function() {
    if (this.stack.length==0) return;
    return this.stack.pop();
};
MinStack.prototype.top = function() {
    if (this.stack.length==0) return;
    return this.stack[this.stack.length - 1].val;
};
MinStack.prototype.getMin = function() {
    if (this.stack.length==0) return;
    return this.stack[this.stack.length - 1].min;
};