Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
getMin函数要求返回当前栈中最小值,而又有push又有pop,一旦入栈的所有元素中的最小值被pop出后,用变量min很难记录当前栈中的次小值,不适于动态的场景,所以要设计一个栈来记录当前最小的值。一旦这个值被弹出,对应的记录栈中的元素也相应被弹出。
Source
class MinStack {
Stack<Integer> a = new Stack<Integer>();
Stack<Integer> minA = new Stack<Integer>();
public void push(int x){
if(minA.isEmpty()){
minA.push(x);
}
else if(minA.peek() >= x){ //注意等于的时候也要入栈
minA.push(x);
}
a.push(x);
//System.out.println(a.peek());
}
public void pop(){
if(!minA.isEmpty() && a.peek().equals(minA.peek())){ //isEmpty的返回值是布尔型
minA.pop();
}
if(!a.isEmpty()) a.pop();
}
public int top(){
return a.peek(); //peek()返回栈顶元素
}
public int getMin(){
if(!minA.isEmpty())
return minA.peek();
return 0;
}
}
Test
public static void main(String[] args){
MinStack s = new MinStack();
s.push(2);
s.push(4);
s.push(5);
s.push(3);
s.push(6);
s.pop();
s.pop();
s.pop();
System.out.println(s.getMin());
}