题目
设计一个支持 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; };