最小栈的实现

《小灰的算法之旅》学习笔记

题目:
实现一个栈,该栈带有出栈(pop),入栈(push),取最小元素(getMin)3个方法,要保证这3个方法的事件复杂度都是O(1)

解决方法:

  1. 设原有的栈为A,新建一个辅助栈B
  2. 当第1个元素进入栈A时,让新元素也进入栈B,此时,这个唯一的元素就是栈A的最小值
  3. 之后,当新元素进入栈A时,比较新元素和栈A当前最小值的大小,如果小于栈A当前最小值,则让新元素也进入栈B
  4. 每当栈A有元素出栈时,若出栈元素是栈A当前最小值,则让栈B的栈顶元素出栈,此时,栈B余下的栈顶元素所指向的,就是栈A中原本第2小的元素
  5. 当调用getMin方法时,返回栈B的栈顶元素的值,该值就是栈A的最小值

分析:
该方法中,进栈,。出栈,取最小值的时间复杂度都为O(1),最坏情况下的空间复杂度为O(n),最坏情况就是,进入栈A中的元素,原本就有序(倒序)

在这里插入图片描述

//    进栈
    public void push(Stack A,int element,Stack B){
//        栈A为空 或 新元素小于等于B的栈顶元素,则新元素压入B
        if (A.getMaxSize()==0 || element<=B.getTop()){
            B.push(element,B);
        }
        A.push(element,A);
    }

//    出栈
    public int pop(Stack A,Stack B){
        int element;
        element = A.pop(A);
//        若出栈元素和B栈顶元素相等,则B栈顶出栈
        if (element == B.getTop()){
            B.pop(B);
        }
        return element;
    }

    public int getMin(Stack A,Stack B){
        int minElement;
        minElement = B.getTop();
        return minElement;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值