Use two stacks - one for values, one for tracking minimum.
1class MinStack {
2 private Stack<Integer> stack;
3 private Stack<Integer> minStack;
4
5 public MinStack() {
6 stack = new Stack<>();
7 minStack = new Stack<>();
8 }
9
10 public void push(int val) {
11 stack.push(val);
12 if (minStack.isEmpty() || val <= minStack.peek()) {
13 minStack.push(val);
14 }
15 }
16
17 public void pop() {
18 int val = stack.pop();
19 if (val == minStack.peek()) {
20 minStack.pop();
21 }
22 }
23
24 public int top() {
25 return stack.peek();
26 }
27
28 public int getMin() {
29 return minStack.peek();
30 }
31}