思路1:将最小值保存在变量min中,每次入栈时,新入栈的元素x与min作比较,如果新入栈元素x比min小;则令min=x;这样就能得到栈中的 最小元素。但是这个方法有问题,当栈内最小元素进行出栈操作后,不确定当前栈的最小元素了,也就无法得到当前栈的 最小元素。
思路2:利用辅助栈。主栈元素x每次直接入栈,辅助栈入栈前先要判断栈是否为空,如果为空,直接入栈。如果不为空,将新入主栈的元素x与辅助栈栈顶元素min进行比较,若x>min,则操作min再次进入辅助栈(此时最小元素仍为辅助栈栈顶元素min);若x<min;则操作x进入辅助栈(更新辅助栈栈顶元素,使其始终为最小值)相当于更新min=x;
例子: pop() pop() pop()
主栈: 21320 主栈: 2132 主栈: 213 主栈: 21
辅助栈:21110 辅助栈:2111 辅助栈:211 辅助栈:21
这个方法能保证辅助栈栈顶元素始终为主栈中的最小元素。
/**
* initialize your data structure here.
*/
var MinStack = function() {
this.stack=[];
this.minStack=[];
};
/**
* @param {number} x
* @return {void}
*/
MinStack.prototype.push = function(x) {
this.stack.push(x);
if(!this.minStack.length){
this.minStack.push(x)
return;
}
if(x<=this.minStack[this.minStack.length-1]){
this.minStack.push(x);
}else{
this.minStack.push(this.minStack[this.minStack.length-1]);
}
return null;
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
if(this.stack.length && this.minStack.length){
this.stack.pop();
this.minStack.pop();
}
return null;
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
return this.stack[this.stack.length-1];
};
/**
* @return {number}
*/
MinStack.prototype.min = function() {
return this.minStack[this.minStack.length-1];
};
/**
* Your MinStack object will be instantiated and called as such:
* var obj = new MinStack()
* obj.push(x)
* obj.pop()
* var param_3 = obj.top()
* var param_4 = obj.min()
*/
测试数据:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
遇到的问题:刚开始还是在利用min保存主栈的最小元素,每次将min入到辅助栈中,但是这里出现了问题,将min定义在push()函数中时,min的作用域实际上是一个局部作用域,每次调用push()函数时,min重新声明赋值,调用完成后,min的空间被释放,所以实际上调用push()函数时,除了第辅助栈为空min被赋值,之后的每一次min都是“undefined”,,与x的比较实际毫无意义,所以无法保存主栈最小元素。-----直接利用辅助栈的栈顶元素与新元素x比较即可,无需借助第三个变量。