超链接👇
最小栈
题目要求:
思路:创建最小栈和数据栈,最小栈用来保存最小值,数据栈用来数据的正常压栈出栈
要领:入栈:数据最小时,两个栈一起入。出栈:数据最小时,要更新最小栈中的值
1.创建最小栈和数据栈,并且初始化
class MinStack {
//最小栈和数据栈
//入栈时,若数据最小,需要两个栈都要入栈,出栈时,如果出的数据为最小,需要更新最小栈
Stack<Integer> Minstack;//最小栈 存最小值
Stack<Integer> sdata;//数据栈 数据正常的压栈出栈
public MinStack() {//初始化栈
Minstack = new Stack<>();
sdata = new Stack<>();
}
}
2.入栈时,当最小栈为空或者val值小于等于最小栈栈顶时,最小栈存入最小值val
public void push(int val) {
sdata.push(val);
//最小栈压栈:当最小栈为空或val值小于等于栈顶的时候才压栈
if(Minstack.isEmpty() || val <= Minstack.peek()){
Minstack.push(val);
}
}
3.出栈时,先判断两个栈的栈顶是否相等(使用equals),相等时最小栈才可以出栈。然后数据栈再出栈
ps:如果数据栈先出栈后再判断两个栈的栈顶是否相等,会少比较一个元素
public void pop() {
//先判断是否相等,然后数据栈再出栈,
//否则无法保证最小栈和数据栈 栈顶元素都相同
//最小栈出栈:当数据栈栈顶和最小栈栈顶相同时出栈,保证了最小值可以更新
if(sdata.peek().equals(Minstack.peek())){
Minstack.pop();
}
sdata.pop();
}
4.获取栈顶元素和O(1)获取最小值
public int top() {
return sdata.peek();
}
public int getMin() {
return Minstack.peek();
}
}
完整代码👇
class MinStack {
//最小栈和数据栈
//入栈时,若数据最小,需要两个栈都要入栈,出栈时,如果出的数据为最小,需要更新最小栈
Stack<Integer> Minstack;//最小栈 存最小值
Stack<Integer> sdata;//数据栈 数据正常的压栈出栈
public MinStack() {//初始化栈
Minstack = new Stack<>();
sdata = new Stack<>();
}
public void push(int val) {
sdata.push(val);
//最小栈压栈:当最小栈为空或val值小于等于栈顶的时候才压栈
if(Minstack.isEmpty() || val <= Minstack.peek()){
Minstack.push(val);
}
}
public void pop() {
//先判断是否相等,然后数据栈再出栈,
//否则无法保证最小栈和数据栈 栈顶元素都相同
//最小栈出栈:当数据栈栈顶和最小栈栈顶相同时出栈,保证了最小值可以更新
if(sdata.peek().equals(Minstack.peek())){
Minstack.pop();
}
sdata.pop();
}
public int top() {
return sdata.peek();
}
public int getMin() {
return Minstack.peek();
}
}
运行结果👇