简单就是维护两个栈就行了,但是看到讨论区的一个栈实现也是挺有意思的,记录一下
two stack
public class MinStack{
Stack<Integer> stack1=new Stack<>();
Stack<Integer> stack2=new Stack<>();
int min=Integer.MAX_VALUE;
public void push(int a){
stack1.push(a);
if(a<min){
min=a;
stack2.push(min);
}
}
public int pop(){
int a=stack1.pop();
if(a==min){
stack2.pop();
}
}
public int top(){
return stack1.peek();
}
public int getMin(){
if(!stack2.isEmpty()){
return stack2.peek();
}else {
}
}
}
老实说这样漏洞是没有判断栈是否已经为空的情况,要是使用两个栈的话这样的情况就会多很多。
one stack
public class MinStack {
int min = Integer.MAX_VALUE;
Stack<Integer> stack = new Stack<>();
//每次压栈之前要把前面部分数据的最小值放进去
public void push(int x) {
if (x <= min) {
stack.push(min);
min = x;
}
stack.push(x);
}
//这两个操作是最重要的,假如是弹出的是当前部分的最小值,就要取出在前面部分被压入的最小值
public void pop() {
if (stack.pop() == min) {
min = stack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}
同样是没有判断空的情况,但是这里比较巧妙地把最小值和真正的值放进了一个栈中,节省了空间,还是比较容易理解的。