Java 数据结构 最小栈的实现

news2024/11/14 13:35:07

在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.coloradmin.cn/o/2149235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑

在现代应用部署时中&#xff0c;Docker容器化技术被广泛应用。Node.js应用在容器中运行时&#xff0c;有时需要获取宿主机的基础信息&#xff0c;如系统信息、内存使用情况、磁盘空间和启动时间等。本文将介绍如何在Docker容器内的Node.js应用中获取这些信息&#xff0c;以及可…

数字化转型中的企业蓝图构建:基于业务能力建模的全面解读与战略实施指南

随着企业数字化转型的不断深入&#xff0c;业务复杂性和技术需求的多样化推动了企业架构的新变革。为了应对日益复杂的市场环境&#xff0c;如何构建清晰、稳定的业务蓝图成为企业成败的关键。《业务能力指南》为此提供了系统的框架和指导&#xff0c;帮助企业通过业务能力建模…

谷歌女高管被裁员,3份兼职越干越开心!55岁正是闯的年纪!

在职场的金字塔顶端&#xff0c;那些大龄女性高管正在面对一场无形却深刻的危机。曾经&#xff0c;她们凭借坚定的决心和无畏的勇气&#xff0c;在职场中披荆斩棘&#xff0c;闯出了一片天地。 现代职场的年轻化和技术更新正将她们逐渐推向边缘。裁员通知的突如其来&#xff0…

Vue3.0组合式API:使用ref获取DOM元素

Vue3.0组合式API系列文章&#xff1a; 《Vue3.0组合式API&#xff1a;setup()函数》 《Vue3.0组合式API&#xff1a;使用reactive()、ref()创建响应式代理对象》 《Vue3.0组合式API&#xff1a;computed计算属性、watch监听器、watchEffect高级监听器》 《Vue3.0组合式API&…

Go语言grequests库并发请求的实战案例

在当今快速发展的互联网时代&#xff0c;数据的获取和处理速度成为了衡量一个系统性能的重要标准。Go语言以其并发处理能力而闻名&#xff0c;而grequests库则为Go语言的HTTP请求提供了简洁易用的API。本文将通过一个实战案例&#xff0c;介绍如何使用Go语言的grequests库来实现…

卖家必看:利用亚马逊自养号测评精选热门产品,增强店铺权重

在亚马逊的商业版图中&#xff0c;选品始终占据着核心地位&#xff0c;是贯穿其经营策略的永恒旋律。一个商品能否脱颖而出&#xff0c;成为市场中的明星爆款&#xff0c;其关键在于卖家对产品的精挑细选&#xff0c;这一环节的重要性不言而喻&#xff0c;是决定胜负的关键所在…

C++笔记21•C++11的新特性•

相比于 C98/03&#xff0c;C11则带来了数量可观的变化&#xff0c;其中包含了约140个新特性&#xff0c;以及对C03标准中约600个缺陷的修正&#xff0c;这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言&#xff0c;C11能更好地用于系统开发和库开发、语法更加泛华和简…

【C语言】自定义类型——结构体

目录 一、结构体的类型的声明 二、结构体变量的创建和初始化 三、匿名结构体类型 四、结构体自引用 五、结构体内存对齐 &#xff08;1&#xff09;对齐规则 &#xff08;2&#xff09;计算结构体大小练习 &#xff08;3&#xff09;需要内存对齐的原因 &#xff08;4…

Eigen3 教程基础篇(三)

参考 Eigen3 主页&#xff0c;Eigen3 官网教程 矩阵的本质&#xff0c;通过多种矩阵的应用去感受矩阵本质 3Blue1Brown 的线性代数&#xff0c;用可视化方法来表现线性代数的特性&#xff0c;强推 如何理解复数和虚数&#xff0c;有动画方便理解复数的意义 相关文章 Eigen…

基于SpringBoot+Vue+MySQL的在线宠物用品商城销售系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着人们生活质量的提升和宠物经济的蓬勃发展&#xff0c;宠物已成为众多家庭不可或缺的一员。宠物市场的需求日益增长&#xff0c;涵盖了食品、用品、医疗、美容等多个领域。基于SpringBootVueMySQL的在线宠物用品商城销售系统…

新产品,推出 MLX90372GVS 第三代 Triaxis® 位置传感器 IC,适用于汽车和工业系统(MLX90372GVS-ACE-308)

Triaxis 旋转和线性位置传感器IC&#xff1a; MLX90372GVS-ACE-103 MLX90372GVS-ACE-108 MLX90372GVS-ACE-301 MLX90372GVS-ACE-200 MLX90372GVS-ACE-208 MLX90372GVS-ACE-303 MLX90372GVS-ACE-300 MLX90372GVS-ACE-350 MLX90372GVS-ACE-100 MLX90372GVS-ACE-101 MLX90372GVS-…

【Java算法】二叉树的深搜

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 一.2331.计算布尔二叉树的值 题目链接&#xff1a;2331.计算布尔二叉树的值 代码 public boolean evaluateTree(TreeNode root) {if(root.leftnull){return root.val0?f…

VSCode值得推荐的插件(持续更新中)

VSCode值得推荐的插件&#xff08;持续更新中&#xff09; 说明1.Peacock 说明 主要记录VSCode开发过程中插件 1.Peacock 允许开发者为 Visual Studio Code 的工作区界面&#xff08;如侧边栏、底栏和标题栏&#xff09;自定义颜色&#xff0c;以区分不同的项目或编码环境。…

【machine learning-七-线性回归之成本函数】

监督学习之cost function 成本函数权重、偏置如何实现拟合数据成本函数是如何寻找出来w和b&#xff0c;使成本函数值最小化&#xff1f; 在线性回归中&#xff0c;我们说到评估模型训练中好坏的一个方法&#xff0c;是用成本函数来衡量&#xff0c;下面来详细介绍一下 成本函数…

需求3:照猫画虎

说起写需求&#xff0c;其实对于我这种小白而言&#xff0c;接到一个需求&#xff0c;最好的方式就是照猫画虎。 因为我从0到1写&#xff0c;以我现在这种水平&#xff0c;根本就不可能完成。所以照猫画虎&#xff0c;模仿着来写是最好的提升方法。 之前在聊天的时候&#xf…

记录|如何对批量型的pictureBox组件进行批量Image设置

目录 前言一、问题表述二、批量化处理更新时间 前言 参考文章&#xff1a; 一、问题表述 问题就是上图所示&#xff0c;这些的命名风格统一&#xff0c;只是最后的数字是不同的。所以存在可以批量化进行处理的可能性。 二、批量化处理 private void SetPictureBoxImages(){for…

Flat File端口更新:如何实现嵌套结构

Flat File端口可以实现平面文件和XML文件的互相转换&#xff0c;本文主要介绍在知行之桥EDI系统8971及更高版本中&#xff0c;Flat File端口如何支持类似EDI嵌套结构的转换。 Flatfile端口如何自定义嵌套结构 下载示例工作流以及示例文件 打开知行之桥EDI系统&#xff0c;创建…

OpenCV特征检测(1)检测图像中的线段的类LineSegmentDe()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 检测图像中线段的类.。 遵循在 285中描述的算法。 函数原型1 绘制两组线&#xff0c;一组用蓝色&#xff0c;一组用红色&#xff0c;并计算非重…

[云服务器12] 搭建eaglercraft网页MC

众所周知&#xff0c;MC是一个炒鸡好玩的游戏&#xff01; 但是&#xff0c;Mojang开发出来是经过Java JAR打包过的的.jar文件&#xff0c;这就不得不依赖HMCL PCL BakaXL等启动器来启动了…… 所以今天&#xff0c;我们将使用开源的eaglercraft来搭建一个在线版MC&#xff0…

鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别

一、介绍 鸟类识别系统。本系统采用Python作为主要开发语言&#xff0c;通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;然后进行模型的迭代训练&#xff0c;得到一个识别精度较高的模型&#xff0c;然后在…