155. 最小栈

Java,辅助栈,与数据栈同步版本
// 使用辅助栈记录最小值// 入栈操作:如果 x 比辅助栈顶小则将 x 推入辅助栈// 如果 x 比辅助栈顶大则在辅助栈 push 自身的栈顶,因为辅助栈的长度要与数据栈同步// pop 操作时直接将两个栈同时 popclass MinStack {private Deque<Integer> data;private Deque<Integer> min;public MinStack() {data = new LinkedList<>();min = new LinkedList<>();}public void push(int x) {data.push(x);if (min.isEmpty() || x < min.peek()) {min.push(x);} else {min.push(min.peek());}}public void pop() {data.pop();min.pop();}public int top() {return data.peek();}public int getMin() {return min.peek();}}
Java,辅助栈,与数据栈非同步版本
// 使用辅助栈记录最小值// 入栈操作:如果 x 小于等于辅助栈顶才将 x 推入辅助栈,// 出栈操作:如果数据栈顶与辅助栈顶相同才将辅助栈弹出一个元素class MinStack {private Deque<Integer> data;private Deque<Integer> min;public MinStack() {data = new LinkedList<>();min = new LinkedList<>();}public void push(int x) {data.push(x);if (min.isEmpty() || x <= min.peek()) {min.push(x);}}public void pop() {if (data.pop().equals(min.peek())) {min.pop();}}public int top() {return data.peek();}public int getMin() {return min.peek();}}
Java 使用辅助类记录最小值
// 使用一个类记录每个节点的最小值,在push操作的时候缓存这个最小值 // 其它操作只要直接返回结果即可 class MinStack { private Deque<MinStackNode> data; public MinStack() { data = new LinkedList<>(); } public void push(int x) { MinStackNode node = new MinStackNode(x, x); if (!data.isEmpty()) { if (x < data.peek().min) { node.min = x; } else { node.min = data.peek().min; } } data.push(node); } public void pop() { data.pop(); } public int top() { return data.peek().val; } public int getMin() { return data.peek().min; } private static class MinStackNode { public int val; public int min; public MinStackNode(int val, int min) { this.val = val; this.min = min; } } }
