题解 | #包含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。