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.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Example:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> Returns -3.
minStack.pop();
minStack.top();      --> Returns 0.
minStack.getMin();   --> Returns -2.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

class MinStack {
    
    private LinkedList<Node> stack = new LinkedList<>();
    
        
    /*     value, min
    
           -3, -3 
            0, -2
           -2, -2  
    */
        
    /** initialize your data structure here. */
    public MinStack() {
        
    }
    
    public void push(int x) {
        Node node;
        if (stack.isEmpty()) {
            node = new Node(x, x);
        } else {
            int min = Math.min(x, stack.peekFirst().min);
            node = new Node(x, min);
        }
        
        stack.push(node);
        
        System.out.printf("val %d min %d\n", node.value, node.min);
        
        
    }
    
    public void pop() {
        Node pop = stack.pop();
       System.out.printf("pop val %d min %d\n", pop.value, pop.min);
      
    }
    
    public int top() {
        return stack.peekFirst().value;
    }
    
    public int getMin() {
        Node first = stack.peekFirst();
        System.out.printf("getMin val %d min %d\n", first.value, first.min);
        return first.min;
    }
    
    class Node {
        
        Node(int value, int min) {
            this.value= value;
            this.min = min;
        }
        int value;
        int min;
    }
}

/**
 * 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();
 */