题目
思路
我们解决这道题只需要再创建一个栈来存放每次入栈的最小值
** 例如 **
每次入min栈时 和min栈顶元素进行比较
这个时候栈顶存放的就是stack栈中数据的最小值
当我们弹出stack栈中的数据时 如果这个数据和min栈栈顶元素相同 此时把min栈栈顶的元素也弹出 此时min中的栈顶元素还是stack中的最小元素
代码
class MinStack {
//初始化两个栈
Stack<Integer> stack;
Stack<Integer> min;
public MinStack() {
stack = new Stack<>();
min = new Stack<>();
}
//压栈方法
public void push(int val) {
//先将val压入stack中
stack.push(val);
//如果此时min栈为空 说明这是第一个元素 直接插入不需要判断
if(min.empty()){
min.push(val);
}else{
//如果此时min栈不为空 则和栈顶元素进行判断
if(val <= min.peek()){
//必须有等于
//因为我们在pop时 如果是最小值要将两个栈的栈顶元素都弹出
//如果stack中恰好插入了两个相同的最小元素
//此时如果pop 则min栈的栈顶就不是最小的值了
min.push(val);
}
}
}
public void pop() {
//如果栈为空 则直接返回
if(stack.empty()){
return;
}
//取出stack栈顶元素
int k = stack.pop();
//判断是否和min栈顶元素相同
//如果相同min也弹出
if(k == min.peek()){
min.pop();
}
}
//获取stack栈顶元素
public int top() {
//如果栈为空返回0
if(stack.empty()){
return 0;
}
return stack.peek();
}
//获取栈中的最小值
//我们只需要返回min栈栈顶的元素即可
public int getMin() {
if(min.empty()){
return 0;
}
return min.peek();
}
}