实时筛选出栈中的最小元素(图解过程)

#实时筛选出栈中的最小元素
#因为栈中的元素只能再栈顶进行操作,所以不能遍历,只能在建立栈的时候就进行比较,得出最小元素
#建立一个辅助栈min,用来存储每次比较的最小元素
#由于栈主要操作是插入或者删除,并且这两个操作都有可能改变最小元素
#插入push(e)操作:进栈第一个元素时,主栈和辅栈都进栈第一个元素;之后再进栈,先判断是否要进辅栈(只有新进的这个元素小于原来辅栈存贮的栈顶元素时才进栈),然后再进主栈
#删除pop()操作:由于进栈的性质,辅栈元素从栈底到栈顶是递增的,所以删除操作只要主栈出栈元素与辅栈栈顶元素不相等就不操作辅栈,如果相等就一起出栈

具体代码如下:

#实时筛选出栈中的最小元素
#因为栈中的元素只能再栈顶进行操作,所以不能遍历,只能在建立栈的时候就进行比较,得出最小元素
#建立一个辅助栈min,用来存储每次比较的最小元素
#由于栈主要操作是插入或者删除,并且这两个操作都有可能改变最小元素
#插入push(e)操作:进栈第一个元素时,主栈和辅栈都进栈第一个元素;之后再进栈,先判断是否要进辅栈(只有新进的这个元素小于原来辅栈存贮的栈顶元素时才进栈),然后再进主栈
#删除pop()操作:由于进栈的性质,辅栈元素从栈底到栈顶是递增的,所以删除操作只要主栈出栈元素与辅栈栈顶元素不相等就不操作辅栈,如果相等就一起出栈

class STACK:
    def __init__(self):
        self.data=[]
        self.mindata=[]

    #辅栈min栈的基本运算方法
    #辅栈的基本操作和建立普通顺序栈是一样的
    def __minempty(self):  # 判断栈是否为空
        if len(self.data) == 0:  # 即判断列表的长度,长度为0顺序栈为空,不为0顺序栈不为空
            return True
        return False

    def __minpush(self, e):  # 元素e进栈
        self.data.append(e)  # 列表中的操作就是append操作

    def __minpop(self):  # 元素出栈
        assert not self.empty()
        return self.data.pop()  # 列表的pop操作,返回最后一个元素

    def __mingettop(self):
        assert not self.empty()
        return self.data[-1]  # 返回列表序号为-1的元素,也就是返回最后一个元素



    #主栈的运算方法(与平常的建站不同,min辅栈的建立和平常建立顺序栈是一样的,而主栈的建立需要融入min辅栈的基本操作)
    def empty(self):
        return  len(self.data)==0#这里是一个判断语句,返回True或者False

    def push(self,x):
        if self.empty() or x<=self.Getmin():#进栈第一个元素时,主栈和辅栈都进栈第一个元素;之后再进栈,先判断是否要进辅栈(只有新进的这个元素小于原来辅栈存贮的栈顶元素时才进栈),然后再进主栈
            self.__mindata.append(x)
        self.data.append(x)

    def pop(self):
        assert not self.empty()
        x=self.data.pop()#先主栈出栈
        if x==self.__mingettop():#由于进栈的性质,辅栈元素从栈底到栈顶是递增的,所以删除操作只要主栈出栈元素与辅栈栈顶元素不相等就不操作辅栈,如果相等就一起出栈
            self.__minpop()
        return x

    def gettop(self):
        assert not self.empty()
        return self.data[-1]

    def Getmin(self):
        assert not self.empty()
        return self.__mindata[-1]

st=STACK()
print('\n元素5,6,3,7依次进栈')
st.push(5)
st.push(6)
st.push(3)
st.push(7)
print('求最小元素并出栈')
while not st.empty():
    print('最小元素:%d'%(st.Getmin()))
    print('出栈元素:%d' % (st.pop()))
print()

图解过程如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏歌~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值