LeetCode力扣 —— 最小栈

最小栈 - 就是在栈中添加一个求栈中最小元素的方法

问题描述

设计一个栈,其中包括

  • push():给栈中添加元素
  • pop():获取栈顶元素(顺便将栈顶元素删除)
  • top():读取栈顶元素(不删除元素)
  • getMin():读取当前栈中的最小元素

示例

代码 结果
MinStack minStack = new MinStack() 无返回
minStack.push(-2) 无返回
minStack.push(0) 无返回
minStack.push(-3) 无返回
minStack.getMin() -3
minStack.pop() 无返回
minStack.top() 0
min.getMin() -2

代码演示

代码1
  • 思路分析
    设置两个栈,一个栈用来正常放数据,第二个栈用来放当前栈中的最小数据
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    …… 下边的步骤不演示了,大概就是这样了
  • 代码
class MinStack {
    /** initialize your data structure here. */
    Stack<Integer> stack = new Stack<>();
    Stack<Integer> minStack = new Stack<>();

    public MinStack() {
    }

    public void push(int x) {
        stack.push(x);
        if(!minStack.isEmpty()){
            if(x <= minStack.peek()){
                minStack.push(x);
            }
        }else{
            minStack.push(x);
        }
    }

    public void pop() {
        int top = stack.pop();
        if(top == minStack.peek()){
            minStack.pop();
        }
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }
}
方法2
  • 在方法1 中的最小值,用一个新的栈将其存了起来,我们可以用一个参数存这个值。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    删除 2 之后,将删除后的栈顶数据 3 赋值给 min
    ……之后的操作也不再演示了
  • 代码:
public class MinStack {
    Stack<Integer> stack;
    int min = Integer.MAX_VALUE;

    public MinStack() {
        stack = new Stack<>();
    }

    public void push(int x) {
        if(!stack.isEmpty()){
            if(x <= min){
                stack.push(min);
                min = x;
            }
        }else{
            min = x;
        }
        stack.push(x);
    }

    public void pop() {
        if(stack.peek() == min){
            stack.pop();
            if(!stack.isEmpty()){
                min = stack.pop();
            }
        }else{
            stack.pop();
        }
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return this.min;
    }
}
方法3
  • 思路:我们不用Java提供的Stack,用一个链表实现stack的基础操作,至于 getMin(),我们可以在每个节点中存入一个 min 的值,用来表示当前链表的最小值。
  • 代码:
public class MinStack{
    class Node{
        int val;
        Node next;
        int min;

        public Node(int val, int min) {
            this.val = val;
            this.min = min;
            next = null;
        }
    }

    Node head;

    public MinStack() {
    }

    public void push(int x) {
        if(head == null){
            head = new Node(x, x);
        }else{
            Node node = new Node(x, Math.min(x, head.min));
            node.next = head;
            head = node;
        }
    }

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

    public int top() {
        if(head != null){
            return head.val;
        }else{
            return -1;
        }
    }

    public int getMin() {
        if(head != null){
            return head.min;
        }else{
            return -1;
        }
    }
}
发布了98 篇原创文章 · 获赞 5 · 访问量 6450

猜你喜欢

转载自blog.csdn.net/weixin_43580746/article/details/105349147