Leetcode:155. 最小栈
办法1:
关键点:定义两个栈st和stMin,st寄存所有元素,stMin寄存最小值。
压入:
行将入栈的元素如果val<stMin.peek(),则将val压入stMin,如果val>=stMin.peek(),将stMin栈顶元素再次压入stMin,无论什么状况都要把val压入st。
弹出:
st和stMin别离弹出元素即可。
class MinStack { Stack<Integer> st; Stack<Integer> stMin; /** initialize your data structure here. */ public MinStack() { st = new Stack<Integer>(); stMin = new Stack<Integer>(); } public void push(int val) { st.push(val); if(stMin.isEmpty()){ stMin.push(val); }else if(val < getMin()){ stMin.push(val); }else{ stMin.push(stMin.peek()); } } public void pop() { if(st.isEmpty()){ return; }else{ st.pop(); stMin.pop(); } } public int top() { if(st.isEmpty()){ return -1; }else{ return st.peek(); } } public int getMin() { if(stMin.isEmpty()){ return -1; }else{ return stMin.peek(); } }}
办法2:
1.压栈
如果stMin是空的,则将val压入stMin;如果stMin不为空且val<=stMin.peek(),也将val压入栈中。st无论哪种状况都压入val。
2.出栈
st栈无论哪种状况都把元素弹出。如果st弹出的值等于stMin的栈顶元素时,stMin.pop()把栈顶元素弹出。
class MinStack { Stack<Integer> st; Stack<Integer> stMin; /** initialize your data structure here. */ public MinStack() { st = new Stack<Integer>(); stMin = new Stack<Integer>(); } public void push(int val) { st.push(val); if(stMin.isEmpty()){ stMin.push(val); }else if(val <= getMin()){ stMin.push(val); } } public void pop() { if(st.isEmpty()){ return; }else{ if(getMin() == st.peek()){ stMin.pop(); } st.pop(); } } public int top() { if(st.isEmpty()){ return -1; }else{ return st.peek(); } } public int getMin() { if(stMin.isEmpty()){ return -1; }else{ return stMin.peek(); } }}