Java 数据结构 最小栈的实现

news/2024/9/21 14:44:08 标签: java, 数据结构, 开发语言

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

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

入栈(push)操作小结:

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

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

答:要放

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

 出栈(pop)操作小结:

  • 需要判断  出栈的元素  和 最小栈栈顶的元素 是否相同,相同则最小栈也要出栈
java">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.niftyadmin.cn/n/5668974.html

相关文章

MyBatis <if> 标签字符串相等判断的陷阱无需判空的简洁判断方式

<if> 标签判断相等条件时&#xff0c;有时判断会不起作用&#xff0c;一般来说都是细节错误。 比如入参没有判空&#xff0c;或者等式左右的比较对象不是同类型&#xff08;入参String比较int或是入参String比较char&#xff09;。 eg. enable状态为Y时&#xff0c;查询某…

推理阶段不同batch size对大模型推理结果的影响

大模型推理阶段&#xff0c;进行batch inference批处理推理解码&#xff0c;会像预期的那样速度很快推完吗&#xff1f;会不会有什么问题&#xff1f; batch inference推理的结果居然会和一条一条推理结果差的很远&#xff1f;&#xff01;&#xff01; Batch Decoding/Infere…

React——点击事件函数调用问题

问题 <MessageOutlined onClick{handleIconClick(test_task_id,test_run_id)} style{{ width: 36 ,color: #3875f6, filter: brightness(1.5)}} />直接在onClick属性中调用函数并传递参数的语法会有问题。 在JSX中如果想要在事件处理器&#xff08;如onClick&#xff…

什么是HTTP DDOS,如何防护

在当今高度互联的网络世界中&#xff0c;网络安全威胁日益严峻&#xff0c;其中HTTP DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击作为一种常见的网络攻击手段&#xff0c;给企业和个人用户带来了巨大的挑战。今天我们就来详细介…

netty编程之基于websocket发送二进制数据

写在前面 本文看下基于websocket发送二进制数据。 1&#xff1a;正文 直接看源码吧&#xff0c;主要如下几个类&#xff1a; WebSocketServerProtocolHandler (内置)&#xff1a;负责websocket握手消息处理 BinaryWebSocketFrameHandler(自定义)&#xff1a;负责处理二进制…

Centos 7 搭建Samba

笔记&#xff1a; 环境&#xff1a;VMware Centos 7&#xff08;网络请选择桥接模式&#xff0c;不要用NAT&#xff09; 遇到一个问题就是yum 安装404&#xff0c;解决办法在下面&#xff08;没有遇到可以无视这句话&#xff09; # 安装Samba软件 yum -y install samba# 创建…

VIVADO IP核之FIR插值器多相滤波仿真

VIVADO IP核之FIR插值器多相滤波仿真&#xff08;含有与MATLAB仿真数据的对比&#xff09; 目录 前言 一、滤波器系数生成 二、用MATLAB生成仿真数据 三、VIVADO FIR插值多相滤波器使用 四、VIVADO FIR插值多相滤波器仿真 五、VIVADO工程下载 总结 前言 网络上有许多文章…

IPsec-Vpn

网络括谱图 IPSec-VPN 配置思路 1 配置IP地址 FWA:IP地址的配置 [FW1000-A]interface GigabitEthernet 1/0/0 [FW1000-A-GigabitEthernet1/0/0]ip address 10.1.1.1 24 [FW1000-A]interface GigabitEthernet 1/0/2 [FW1000-A-GigabitEthernet1/0/2]ip address