155. 最小栈

180 阅读1分钟

方法一:

  • 用链表
  • head中存放当前栈中的最小值,每次put时更新。
class MinStack {
    
    class ListNode {
        int val;
        int min; // 以当前node为head的链表的最小值
        ListNode next;
        public ListNode(int val) {
            this.val = val;
        }
    }

    ListNode head;
    
    public MinStack() {
        head = null;
    }
    
    public void push(int val) {
        ListNode newNode = new ListNode(val);
        if (head == null) { // 添加首个元素时
            newNode.min = val;   
        } else {
            newNode.min = newNode.val < head.min ? newNode.val : head.min;
        }
        newNode.next = head;
        head = newNode;
    }
    
    public void pop() {
        head = head.next;
    }
    
    public int top() {
        return head.val;
    }
    
    public int getMin() {
        return head.min;
    }
}

方法二: 双栈

  • stack记录正常元素
  • minstack对应顺序的元素和stack对齐,记录stack中当前位置上的元素该返回的min
class MinStack {
    Stack<Integer> stack;
    Stack<Integer> minStack;

    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }
    
    public void push(int val) {
        stack.push(val);
        if (minStack.size() == 0 || val < minStack.peek()) {
            minStack.push(val);
        } else {
            minStack.push(minStack.peek());
        }
    }
    
    public void pop() {
        stack.pop();
        minStack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}