《算法通关村—最大小栈问题解析》
最小栈
描述
leetCode 155: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现最小栈
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
怎么才能在常数时间内拿到最小元素,我们通过设计两个栈,一个栈存储元素,一个栈存储最小元素(这个存储的是当前元素加入进来的时候,整个栈中最小的元素,比如说)
# 储存元素的栈为stack,最小元素的栈为minStack
push(5);
stack -> [5];
minStack -> [5];
push(6) ;
stack -> [5,6];
minStack -> [5,5]; # 这里如果插入的时候就跟当前最小栈中的元素比较,如果更小就插入,如果没有更小就插入原来最小的。
通过有这样两个栈,对原来元素的栈进行操作的时候,同时对最小栈进行操作,这样就能保证在常数时间内获得栈内最小元素了。
实现代码
package AlgorithmForth;import java.util.Deque;
import java.util.LinkedList;/*** 最小栈*/
public class MinStack {Deque<Integer> xStack;Deque<Integer> minStack;public MinStack() {xStack = new LinkedList<>();minStack = new LinkedList<>();minStack.push(Integer.MAX_VALUE);}public void push(int x) {xStack.push(x);minStack.push(Math.min(minStack.peek(), x));}public void pop() {xStack.pop();minStack.pop();}public int top() {return xStack.peek();}public int getMin() {return minStack.peek();}public static void main(String[] args) {MinStack minStack1 = new MinStack();minStack1.push(1);minStack1.push(8);minStack1.push(2);minStack1.push(12);minStack1.push(8);System.out.println(minStack1.getMin());}
}
最大栈
LeetCode 716.设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素
实现MaxStack
MaxStack() 初始化栈对象
void push(int x) 将元素 x 压入栈中。
int pop() 移除栈顶元素并返回这个元素。
int top() 返回栈顶元素,无需移除。
int peekMax() 检索并返回栈中最大元素,无需移除。
int popMax() 检索并返回栈中最大元素,并将其移除。 如果有多个最大元素,只要移除 最靠近栈顶 的那个。
最大栈的实现其实和最小栈是差不多的,都是通过两个栈来实现常数查找到最大。
直接上代码
package AlgorithmForth;import java.util.Stack;/*** 最大栈*/
public class MaxStack {Stack<Integer> stack;Stack<Integer> maxStack;public MaxStack() {stack = new Stack<>();maxStack = new Stack<>();}public void push(int x) {int max = maxStack.isEmpty() ? x : maxStack.peek();maxStack.push(max > x ? max : x);stack.push(x);}public int pop() {maxStack.pop();return stack.pop();}public int top() {return stack.peek();}public int peekMax() {return maxStack.peek();}public int popMax() {int max = peekMax();Stack<Integer> buffer = new Stack<>();while (top() != max) buffer.push(pop());pop();while (!buffer.isEmpty()) push(buffer.pop());return max;}public static void main(String[] args) {MaxStack maxStack1 = new MaxStack();maxStack1.push(1);maxStack1.push(8);maxStack1.push(2);maxStack1.push(12);maxStack1.push(8);System.out.println(maxStack1.peekMax());}
}
近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。
也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?
也可以加我QQ(2837468248)咨询说明来意!