模仿数据结构栈,求栈中最小值的概述

模仿数据结构栈,求栈中最小值的概述

1.需求:

    /**
     * 1.定义一个栈 里面存的是int类型值,
     * 2.定义一个压栈方法 push
     *                public void push(int num) //参数num是入栈的值
     * 3.定义一个出栈方法 pop
     *                public int pop()  //返回值是出栈的值
     * 4.定义一个获取当时栈中的最小值的方法
     *                public int getMin() // 返回的是栈中的最小值
     */

2.分析:

    /**
     * 分析: 栈的特点是 先进后出 ,有以下几种情况
     * 1. push一个num进去,然后pop出一个num
     * 2. push一个num1进去,然后push一个num2进去,这样num2就是在栈顶,
     *    pop出一个数 也就是num2
     * 3. 这样我们就可以吧栈看成一个存放Integer类型的List集合
     * 4. 每次push一个num相当于 add(num),而且栈顶的num的索引都是List集合最后一个
     * 5. 这样栈顶的索引就是 list.size()-1
     * 6. 创建一个辅助栈(也就是辅助集合)来保存栈中最小值的索引
     * 7. 入栈:
     *    如果入栈push的数小于最小值,那么就把这个入栈的数(也就是栈顶)的索引
     *    存到辅助栈里面;
     *    如果入栈push的数大于等于最小值,那么就不添加到辅助栈中
     *    这样原栈中最小的值的索引就是辅助栈的栈顶值
     * 8. 出栈:
     *    如果出栈的值的索引不等于辅助栈的栈顶值,也就是说,出栈的值的不是最小值
     *    如果出栈的数就是那个第一次出现的最小值数,那么就把辅助栈的栈顶出栈
     *    出栈就是返回栈的栈顶值
     */

3.代码实现

        public class StackDemo {
            //定义原栈
        private ArrayList<Integer> data = new ArrayList<Integer>();

        //定义辅助栈,存放原栈中最小值的索引
        private ArrayList<Integer> mins = new ArrayList<Integer>();

        //定义入栈方法,参数是入栈的值
        public void push(int num) throws Exception {
            //入栈一个数
            data.add(num);
            //如果辅助栈为空,那么存的就是索引0
            if (mins.size()==0){
                mins.add(0);
            }else{ //如果不为空
                //首先获取栈中的最小值
                int min = getMin();
                //只有入栈的元素比最小值小的时候,则辅助栈添加索引
                //这个索引就是data集合的最后一个索引
                if (num<min){
                    mins.add(data.size()-1);
                }
            }
        }

        //定义一个出栈方法 返回的是栈顶的值
        public int pop() throws Exception {
            //如果栈中没有元素了,继续出栈就会抛出异常
            if (data.size()==0){
                throw new Exception("栈为空");
            }else{
                //如果出栈的索引值就是辅助栈的栈顶 也就是说
                //出栈的就是那个第一次出现的最小值
                int minIndex = mins.get(mins.size()-1); //获取mins栈顶值
                if (data.size()-1==minIndex){
                    //辅助栈移除栈顶索引
                    mins.remove(mins.size()-1);
                    //返回栈顶值
                }
                return data.get(data.size()-1);
            }
        }

        //定义一个获取栈中最小值的方法
        public int getMin() throws Exception {
            //如果辅助栈为空,表示抛出异常
            if (mins.size()==0){
                throw new Exception("栈为空");
            }else{ //如果栈不为空
                //最小值索引就是辅助栈的栈顶
                int minIndex = mins.get(mins.size()-1);
                return data.get(minIndex);
            }
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值