当前位置: 首页 > article >正文

Java 数据结构 最小栈的实现

在O(N)时间复杂度内找出最小值:

  1. 创建两个栈
  2. 当普通栈只有一个数据时,把该数据放入最小栈
  3. 往普通栈放入数据时,把要放入的数据和最小栈的栈顶数据相比较,若要放入的数据比最小栈的栈顶数据小,则把该数据放入最小栈
  4. 需要找栈的最小值时,直接取栈顶数据

入栈(push)操作小结:

  • 普通栈一定要放,最小栈放的原则是:
  • 最小栈为空,放
  • 若当前元素比最小栈栈顶元素小,则放

问题:如果要放的元素  等于  最小栈栈顶元素,要放吗?

答:要放

理由:这涉及到出栈(pop)操作,如果pop把最上面的-2出出去了,最小栈栈顶的-2也会出去,但是实际上普通栈内还有一个最小的值-2,但最小栈栈顶已经不是-2了

 出栈(pop)操作小结:

  • 需要判断  出栈的元素  和 最小栈栈顶的元素 是否相同,相同则最小栈也要出栈
import java.util.Stack;

//最小栈代码实现
public class Minstack {
    public Stack<Integer> stack;
    public Stack<Integer> minStack1;

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



    public void push(int val){//入栈操作
stack.push(val);//由于普通栈是一定要放的
        if(minStack1.empty()){//如果最小栈是空的,则往里放
            minStack1.push(val);
        }else {//当最小栈不为空时,放入的元素要和最小栈的栈顶元素去比较,小于等于栈顶则放入最小栈
            int peekVal=minStack1.peek();//先拿到最小栈栈顶元素
            if(val<=peekVal){
                minStack1.push(val);
            }

        }
    }


    public void pop(){//出栈操作
        if(stack.empty()){//如果栈为空,无法出栈
            return;
        }
        //如果栈不为空,先判断两栈顶元素是否相同,相同则最小栈的栈顶也出出去
        int popVal=stack.pop();
        if(popVal==minStack1.peek()){
            minStack1.pop();
        }



    }


    public int top(){//获取普通栈的栈顶元素
        if(stack.empty()){//如果栈为空,无法出栈,此时应该要报一个异常
            return -1;
        }
        return stack.peek();
    }

    public int getMin(){
        if(minStack1.empty()){//如果栈为空,无法出栈,此时应该要报一个异常
            return -1;
        }
        return minStack1.peek();
    }
}


http://www.kler.cn/a/314051.html

相关文章:

  • MySQL数据库:SQL语言入门 【下】(学习笔记)
  • vue2+ element ui 集成pdfjs-dist
  • AutoCad 无界面开发
  • JS 实现SSE通讯和了解SSE通讯
  • C++单例模式实现
  • 应用程序部署(IIS的相关使用,sql server的相关使用)
  • ES6的简单介绍
  • C++: 类和对象(上)
  • 【EasyBlog】基于React+AntD+NextJS+NestJS+MySQL打造的开源博客系统
  • 深耕电通二十年,崔光荣升电通中国首席执行官
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾回收算法
  • 机器学习-点击率预估-论文速读-20240916
  • markdown-it:将Markdown文本转换为HTML格式,展示在页面,怎么自定义里面的a标签设置为在新标签页打开
  • GEE 案例:如何利用LST脚本快速计算指定区域的LST和时序的LST
  • 14 vue3之内置组件trastion全系列
  • pandas 生成excel多级表头
  • [Java]SpringBoot能力进阶
  • 九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”
  • 面向对象例题之例题的特性
  • 在Android中fragment的生命周期
  • 校园场景物体检测系统源码分享
  • Jboss Administration Console弱⼝令
  • macOS平台TensorFlow环境安装
  • 老程序员的数字游戏开发笔记(二) —— 直接开始一个Godot项目
  • SQLServer日期和时间类型
  • SpringCloud从零开始简单搭建 - JDK17