155. Min Stack 「最小栈」

设计一个支持压入、弹出、取顶部元素和取最小元素的栈,且时间复杂度为常数。

  • push(x) – 压入 x 进入栈。
  • pop() – 弹出栈顶元素。
  • top() – 获取栈顶元素。
  • getMin() – 获取栈最小元素。

举例:

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.

我的第一想法是使用一个链表来解决问题,但我看更多人的题解是使用了栈类来做,只可惜我没用过?。这里使用链表就可以轻松解决四个函数中的三个,而最后一个最小值的函数,则借助于链表节点本身来解决,即增加一个变量来保存栈中当前的最小值。

/*
 * 155. Min Stack
 * https://leetcode.com/problems/min-stack/
 * https://www.whosneo.com/155-min-stack/
 */

public class MinStack {
    private Node head = null;

    public static void main(String[] args) {
        MinStack minStack = new MinStack();
        minStack.push(-2);
        minStack.push(0);
        minStack.push(-3);
        System.out.println(minStack.getMin());
        minStack.pop();
        System.out.println(minStack.top());
        System.out.println(minStack.getMin());
    }

    private void push(int x) {
        Node node = new Node();
        node.value = x;
        if (head == null || x < head.min)
            node.min = x;
        else
            node.min = head.min;
        node.next = head;
        head = node;
    }

    private void pop() {
        if (head != null)
            head = head.next;
    }

    private int top() {
        if (head != null)
            return head.value;
        else
            return 0;
    }

    private int getMin() {
        if (head != null)
            return head.min;
        else
            return 0;
    }

    static class Node {
        int value;
        int min;
        Node next;
    }
}