java中栈的算法

本文介绍如何在Java中实现一个栈,不仅支持常规的出栈、入栈操作,而且能在O(1)时间复杂度内返回栈内的最小值。通过维护两个栈——num栈用于一般操作,min栈保存当前最小值,确保了高效查找最小值。在入栈时,新元素与min栈顶比较,若更小则也存入min栈;出栈时,若num栈顶与min栈顶相同,则min栈也出栈。返回最小值直接返回min栈顶即可。

实现一个栈,要求实现该站的出栈,入栈,返回最小值,并且返回最小值方法的时间复杂度为O(1)

思路:定义两个栈num和min,num栈用来实现入栈出栈,min栈的栈顶一直是num栈中所有数的最小值,当有数据入栈时先向num栈存储该数,接着判断min栈是否为空,如果为空的话就直接存入,如果不为空的话将入栈的数与min栈栈顶元素比较,如果入栈的数更小那么min栈入栈,出栈时判断min栈栈顶与num栈栈顶是否相等,相等的话min出栈,然后让num出栈,不相等的话min不出栈,返回最小值时直接返回min栈的栈顶即可

入栈:

1.第一个数5入栈

 

 2.第二个数6入栈

 

 3.第三个数4入栈

出栈

出栈时判断min栈栈顶与num栈栈顶是否相等,相等的话min出栈,然后让num出栈

 相等情况下

不相等情况下

 

当我们返回栈的最小值时只需要输出min栈的栈顶即可

代码实现

import java.util.Stack;

public class StackMin {
     Stack<Integer> num = new Stack<>();
     Stack<Integer> min = new Stack<>();

     //入栈
    public  void push(Integer data){
        // 首先数据栈一定入栈
        num.push(data);
        // 判断min栈当中有没有值,如果没有那么就直接写入,如果有那么要比对当前数据和min栈当中栈顶元素的大小
        if(min.empty() || data<=min.peek()){
            min.push(data);
        }
    }

    //出栈
    public int pop(){
        if (num.peek() == min.peek()){
            min.pop();
        }
        return num.pop();
    }

    //返回最小值
    public void min(){
        if(!min.empty()){
            System.out.println(min.peek());
        }
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值