设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
链接:https://leetcode-cn.com/problems/min-stack
思路:1.整两个栈,一个是原始的堆栈,另外一个记录堆栈的最小的状态。
2.在push的时候,原始堆栈正常操作,最小堆栈要判断是不是比堆栈中顶部的数字相等或者要小。如果符合条件,则入栈,否则不入栈。
3.再pop的时候,判断原始栈出来的值是不是和最小栈一样,如果一样,一起pop,不一样,只pop原始的堆栈
代码:
class MinStack { public static final int INT_MAX= 0x7fffffff; Stack<Integer> S; Stack<Integer> S_min; /** initialize your data structure here. */ public MinStack() { S=new Stack<>(); S_min=new Stack<>(); } public void push(int x) { S.push(x); if(S_min.isEmpty()) { S_min.push(x); } else if((!S_min.isEmpty())&&x<=S_min.peek()) { S_min.push(x); } // System.out.println("after push"); // System.out.println("S_min size="+S_min.size()); // System.out.println("S size="+S.size()); } public void pop() { int a=S.peek(); int b=S_min.peek(); if(a==b) { S.pop(); S_min.pop(); } else { S.pop(); } // System.out.println("after pop"); // System.out.println("S_min size="+S_min.size()); // System.out.println("S size="+S.size()); } public int top() { return S.peek(); } public int getMin() { return S_min.peek(); } } /** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(x); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.getMin(); */