也就是说,要用O(1)的复杂度拿到任意时刻的栈中的最小值,那么自然就不可能去遍历
所以,有这么一种巧妙的方法,申请两个栈,一个是原数据栈,一个是min_stack,min_stack中的栈顶始终存放的是当前数据栈的最小值,也就是说min栈和data栈的数据量是同时增加,同时减少的。
data栈放一个数时,min栈的栈顶和这个数进行比较,如果min栈栈顶比较小,那么把min栈栈顶再push一次,如果新数x比较小,把min_stack.push()
java代码
class MinStack {
Stack <Integer> data_stack;
Stack <Integer> min_stack ;
/** initialize your data structure here. */
public MinStack() {
data_stack =new Stack<Integer>();
min_stack=new Stack<Integer>();
}
public void push(int x) {
data_stack.push(x);
if(min_stack.empty()){
min_stack.push(x);
}
else{
int min_current=min_stack.peek();
if(min_current<x){
min_stack.push(min_current);
}
else{
min_stack.push(x);
}
}
}
public void pop() {
if(!data_stack.empty()){
data_stack.pop();
min_stack.pop();
}
}
public int top() {
int tmp=0;
if(!data_stack.empty()){
tmp=data_stack.peek();
}
return tmp;
}
public int getMin() {
int tmp=0;
if(!min_stack.empty()){
tmp=min_stack.peek();
}
return tmp;
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/