题解 | #包含min函数的栈#
包含min函数的栈
https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49
import java.util.Stack;
public class Solution {
// push 进行入栈操作的
// top 需要返回栈顶元素
// min 需要返回栈中最小元素
// pop 弹出栈顶元素
// 本身栈的操作pop和push,在stack1进行
Stack<Integer> s1 = new Stack<>();
// 最小值存在stack2里面,每次进入stack1的时候比较一下
Stack<Integer> s2 = new Stack<>();
public void push(int node) {
// 新来的元素,直接在stack1进行入栈操作
s1.push(node);
// 对于stack2里面,是记录最小值的,
// 空的时候,或者当前的node比s2里面的值小,把node也加入stack2
if(s2.isEmpty() || s2.peek() > node){
s2.push(node);
}else{
//当前的node比s2的元素大,就不管它,但是要保证s2和s1元素个数一致,就重复加入栈顶
s2.push(s2.peek());
}
}
public void pop() {
s1.pop();
// 弹出当前元素,对最小值也是有影响的
// s1和s2的关系是,s2的元素是小于等于s1的
s2.pop();
}
public int top() {
return s1.peek();
}
public int min() {
return s2.peek();
}
}
主要还是理解Stack的几个常用方法。
push是入栈操作,pop是弹出栈顶并返回当前元素,peek是返回栈顶元素,isEmpty判断栈是不是空的
stack1就是正常的进栈出栈操作,个数与stack2对应,stack2是记录最小值的,空的时候直接进栈,node如果小于stack2的栈顶,进栈,否则,就把stack2的栈顶重复加入。
最小值就是stack2的peek,top就是stack1的peek。
查看8道真题和解析