155. 最小栈

image.png

  • Java,辅助栈,与数据栈同步版本

    1. // 使用辅助栈记录最小值
    2. // 入栈操作:如果 x 比辅助栈顶小则将 x 推入辅助栈
    3. // 如果 x 比辅助栈顶大则在辅助栈 push 自身的栈顶,因为辅助栈的长度要与数据栈同步
    4. // pop 操作时直接将两个栈同时 pop
    5. class MinStack {
    6. private Deque<Integer> data;
    7. private Deque<Integer> min;
    8. public MinStack() {
    9. data = new LinkedList<>();
    10. min = new LinkedList<>();
    11. }
    12. public void push(int x) {
    13. data.push(x);
    14. if (min.isEmpty() || x < min.peek()) {
    15. min.push(x);
    16. } else {
    17. min.push(min.peek());
    18. }
    19. }
    20. public void pop() {
    21. data.pop();
    22. min.pop();
    23. }
    24. public int top() {
    25. return data.peek();
    26. }
    27. public int getMin() {
    28. return min.peek();
    29. }
    30. }
  • Java,辅助栈,与数据栈非同步版本

    1. // 使用辅助栈记录最小值
    2. // 入栈操作:如果 x 小于等于辅助栈顶才将 x 推入辅助栈,
    3. // 出栈操作:如果数据栈顶与辅助栈顶相同才将辅助栈弹出一个元素
    4. class MinStack {
    5. private Deque<Integer> data;
    6. private Deque<Integer> min;
    7. public MinStack() {
    8. data = new LinkedList<>();
    9. min = new LinkedList<>();
    10. }
    11. public void push(int x) {
    12. data.push(x);
    13. if (min.isEmpty() || x <= min.peek()) {
    14. min.push(x);
    15. }
    16. }
    17. public void pop() {
    18. if (data.pop().equals(min.peek())) {
    19. min.pop();
    20. }
    21. }
    22. public int top() {
    23. return data.peek();
    24. }
    25. public int getMin() {
    26. return min.peek();
    27. }
    28. }
  • Java 使用辅助类记录最小值

    // 使用一个类记录每个节点的最小值,在push操作的时候缓存这个最小值
    // 其它操作只要直接返回结果即可
    class MinStack {
    
      private Deque<MinStackNode> data;
    
      public MinStack() {
          data = new LinkedList<>();
      }
    
      public void push(int x) {
          MinStackNode node = new MinStackNode(x, x);
          if (!data.isEmpty()) {
              if (x < data.peek().min) {
                  node.min = x;
              } else {
                  node.min = data.peek().min;
              }
          }
          data.push(node);
      }
    
      public void pop() {
          data.pop();
      }
    
      public int top() {
          return data.peek().val;
      }
    
      public int getMin() {
          return data.peek().min;
      }
    
      private static class MinStackNode {
          public int val;
          public int min;
    
          public MinStackNode(int val, int min) {
              this.val = val;
              this.min = min;
          }
      }
    }