解题思路
重点: 栈a存数据,栈b存栈a各个长度时的最小值。如下:
a: 1 0 -2 -1 0 0 3
b: 1 0 -2 -2 -2 -2 -2
可知: b.peek()=min【即b栈栈顶元素=当前a栈最小值】
易错点:
1.push数据进a时,(非空)若进栈数据x小于当前min(b.peek()=min),则mins.push(x)。
2.ab栈永远相同长度,pop时都要出栈数据。
3.直接return s.peek()时会报空栈错误,需要再判断s.empty()?。
代码
class MinStack {
Stack<Integer> s;//存值的栈a
Stack<Integer> mins;//栈b,代表栈a此时的最小值
public MinStack() {
s=new Stack<Integer>();
mins=new Stack<Integer>();
}
public void push(int x) {
if(!s.empty()) {
if (mins.peek()>x){mins.push(x);}
else{
mins.push(mins.peek());
}
}
else //s is empty,此时输入值=min(当前最小值)
{
mins.push(x);
}
s.push(x);
}
public void pop() {
mins.pop();
s.pop();
}
public int top() {
if(s.empty())return -1;
else
return s.peek();
}
public int min() {
if(mins.empty())return -1;
else
return mins.peek();
}
}
题目链接: 剑指 Offer 30. 包含min函数的栈.