1、题目
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
- MinStack() 初始化堆栈对象。
- void push(int val) 将元素val推入堆栈。
- void pop() 删除堆栈顶部的元素。
- int top() 获取堆栈顶部的元素。
- int getMin() 获取堆栈中的最小元素。
2、解题思路
1、设置一个辅助栈,原始栈正常入栈和出栈,辅助栈始终存当前最小值
2、入栈:每次入栈都入原始栈,对于辅助栈,要判断当前元素和辅助栈的栈顶谁小,小的当栈顶
3、出栈:为了保证辅助栈始终是最小值,辅助栈也必须出栈,因为原始栈出栈伴随着最小元素的出栈,画图一目了然:
4、获取栈顶和最小值就相对简单,栈顶用原始栈,最小值用辅助栈
3、踩坑
1、public void MinStack() :注意这里,IDEA要加上void,提交力扣要去掉
2、出栈的时候,辅助栈也要出栈,因为原始栈出栈伴随着最小元素的出栈
4、代码实现
class Soution { private Stack<Integer> resultStack; private Stack<Integer> helpStack; public void MinStack() { // 注意这里,IDEA要加上void,提交力扣要去掉 resultStack = new Stack<>(); helpStack = new Stack<>(); } public void push(int val) { // 原始栈正常入栈,辅助栈每次只入当前最小值 resultStack.push(val); if (helpStack.isEmpty() || helpStack.peek() >= val){ // 入栈元素<栈顶,就入该元素 helpStack.push(val); }else { // 入栈元素>栈顶,就入栈顶元素 helpStack.push(helpStack.peek()); } } public void pop() { if (!resultStack.isEmpty()){ resultStack.pop(); // 辅助栈也必须出栈,因为原始栈出栈伴随着最小元素的出栈 // 为了保证辅助栈始终是最小值,因此也相应出栈,画图一目了然 helpStack.pop(); }else { throw new RuntimeException("Stack is empty"); } } public int top() { if (!resultStack.isEmpty()){ return resultStack.peek(); } throw new RuntimeException("Stack is empty"); } public int getMin() { if (!helpStack.isEmpty()){ return helpStack.peek(); } throw new RuntimeException("Stack is empty"); } }