最小栈_辅助栈存储最小元素

155. 最小栈

力扣icon-default.png?t=L892https://leetcode-cn.com/problems/min-stack/

难度简单1041

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

示例:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

提示:

  • poptop 和 getMin 操作总是在 非空栈 上调用。

通过次数287,899提交次数502,228

题目描述:

设计一个支持push,pop,top的操作,并能够在常数时间内检索到最小元素的栈。

  • push(x),——将元素x压入栈中;
  • pop(),——删除栈顶元素;
  • top(),——获取栈顶元素;
  • getMin(),——获取栈中的最小元素。

示例:

解释:

先创建一个栈——minStack;

然后push进栈一个元素-2,

然后push进栈一个元素0,

然后push进栈一个元素-3,

然后获取栈中的最小元素——返回-3,

然后进行pop出栈栈顶元素-3,

然后top获取栈顶元素——返回0,

然后获取栈中的最小元素——返回-2。

使用现有的栈数据结构可以完成pop、push、top(对应的是peek操作),但是无法在常数时间内完成getMin()操作,我们的办法是使用一个辅助栈来辅助完成操作。

如下图所示:

 举例:

  1. 首先创建一个数据栈,和一个辅助栈。
  2. 然后push进栈一个元素-2,因为当前数据栈和辅助栈都是空的,所以直接push进去。
  3. 然后push进栈一个元素0,因为0>-2,所以辅助栈的栈顶元素仍然是-2;
  4. 然后push进栈一个元素-3,因为-3小于当前栈顶元素-2,所以-3成为新的栈顶元素;
  5. 然后执行getMin操作,获取当前最小元素,也就是当前辅助栈的栈顶元素——-3;
  6. 然后执行pop出栈操作,因为辅助栈的栈顶元素和数据栈要出栈的元素一样,所以数据栈和辅助栈都执行出栈操作;
  7. 然后执行top操作,返回当前数据栈的栈顶元素,即0;
  8. 然后执行getMin操作,返回当前辅助栈的栈顶元素,即-2。

代码:

package zyh.springcloud.chapter2.service.impl.datastructure.stack;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @ClassName minStack
 * @Author zhangyonghui
 * @Description:最小栈
 * @Date 2021/10/2 16:59
 * @Version 1.0
 **/
public class MinStack {
        private Deque<Integer> dataStack;
        private Deque<Integer> fuzhuStack;

        /**
         * 思想:使用一个辅助栈进行操作:(始终将数据栈栈中最小的元素存入辅助栈的栈顶)
         * 1,当进行入栈的时候,将进行入栈的元素与辅助栈中的栈顶元素进行比较,如果小于当前辅助栈中的栈顶元素,则将该最小值也压入辅助栈中,成为新的栈顶元素;
         * 2,当进行出栈的时候,如果出的元素同时也是辅助栈的栈顶元素,那么连同辅助栈进行一起出栈;
         * 3,当获取栈中的最小元素的时候,则获取辅助栈的栈顶元素。
         */

        /**
         * 构造方法:初始化一个数据栈、一个辅助栈;
         */
        public MinStack() {
                dataStack = new LinkedList<>();
                fuzhuStack = new LinkedList<>();
        }

        /**
         * 入栈操作:进行入栈操作的时候,比较即将入栈的元素与辅助栈中的栈顶元素,如果小于,则将该入栈的元素同时也压入到辅助栈中,成为新的栈顶元素;
         * @param val
         */
        public void push(int val) {
                //如果辅助栈是空的,则不需要进行比较,直接入栈:
                if (fuzhuStack.isEmpty()) {
                        dataStack.push(val);
                        fuzhuStack.push(val);
                }
                //如果辅助栈是非空的,则进行比较:
                else{
                        //取出辅助栈中的现在的栈顶元素:
                        Integer nowStackDing = fuzhuStack.peek();
                        //进行比较:
                        if (nowStackDing >= val) {
                                //将该val压入辅助栈,成为新的栈顶元素;
                                fuzhuStack.push(val);
                        }
                        //压入数据栈:
                        dataStack.push(val);
                }
        }

        public void pop() {
                //出栈操作:如果该数据栈的栈顶元素同时也是辅助栈的栈顶元素,则同时进行出栈,否则只进行数据栈的出栈操作;
                if (dataStack.peek().equals(fuzhuStack.peek())) {
                        dataStack.pop();
                        fuzhuStack.pop();
                }else {
                        dataStack.pop();
                }
        }

        public int top() {
                //获取栈顶元素:
                if (!dataStack.isEmpty()) {
                        return dataStack.peek();
                }else{
                        return -1;
                }
        }

        //获取最小值:
        public int getMin() {
                if (!fuzhuStack.isEmpty()) {
                        return fuzhuStack.peek();
                }else {
                        return -1;
                }
        }

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值