题目:
问题:如果找一个栈的最小元素
- 如果只设置一个变量记录入栈时的最小值,那么当出栈时,这个变量不知道回溯到上一次的最小值。
- 所以需要额外设置一个辅助栈 存放主栈的最小值
- 当主栈入第一个元素时,默认是最小的,所以辅助栈此时也需要入栈
- 之后主栈每次入栈,我辅助栈的栈顶都要和这个新元素比较一下,新元素小于或等于我栈顶,才入栈
- 当主栈出栈时,我比较一下是不是和我辅助栈顶元素一样,一样的话我也要出栈,因为我只记录当前变化后的主栈的最小值。
- 获取辅助栈的栈顶就是当前主栈的最小元素了
package dataStructure.stack;
import java.util.Stack;
public class MinStack {
private Stack<Integer> mainStack = new Stack<>();//主栈
private Stack<Integer> minStack = new Stack<>();//辅助栈,存放主栈中的最小值
//入栈
public void push(int element){
mainStack.push(element);
//如果当前辅助栈为空默认第一个最小,后面如果入栈的还比前面的小 才入辅助栈
if (minStack.isEmpty()|| element<= minStack.peek()){
minStack.push(element);
}
}
//出栈
public Integer pop(){
//当主栈出栈时,我比较一下是不是和我辅助栈顶元素一样,一样的话我也要出栈,因为我只记录当前变化后的主栈的最小值。
if (mainStack.peek().equals(minStack.peek())){
minStack.pop();
}
return mainStack.pop();
}
//获取栈的最小元素
public int getMin() throws Exception {
if (mainStack.isEmpty()){
throw new Exception("stack is empty");
}
return minStack.peek();
}
//测试
public static void main(String[] args) throws Exception {
MinStack minStack = new MinStack();
minStack.push(4);
minStack.push(3);
minStack.push(3);
minStack.push(6);
minStack.push(8);
minStack.push(1);
minStack.push(9);
System.out.println(minStack.getMin());//1
minStack.pop();
minStack.pop();
System.out.println(minStack.getMin());//3
}
}