Python-数据结构-栈-最小栈

1.最小栈

即当前栈顶元素的值始终是栈中元素的最小值。

特别说明:这里的最小栈是在未进行pop操作(push中的pop操作不算)之前的定义,也就是说,我们的第一次pop,返回的结点值是栈中最小的元素。

2.思路

每次入栈时,判断栈顶元素与入栈元素的大小:

  • 入栈元素>栈顶元素: 出栈栈顶元素并保存,入栈新元素,入栈旧栈顶元素
  • 入栈元素<=栈顶元素:直接入栈新元素

3. 代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:cfl
@file:最小栈.py
@time:2021/12/09
@software:PyCharm
"""

"""
最小栈的意思是当前(在有元素入栈的过程中)栈顶元素始终是最小值
"""

class Node:
    def __init__(self,v):
        self.value=v   # 栈结点的值
        self.pre=None


class minStack:
    def __init__(self):
        self.point=None
        self.length=0

    def push(self,v):
        node=Node(v)
        if self.point!=None:
            # 如果新结点值大于栈顶元素值,则将栈顶结点出栈,入栈新结点,之后再入栈原栈顶结点
            # 否则直接入栈新结点
            if node.value>self.point.value:
                # 栈顶元素出栈
                temp=self.pop()
                # 新结点入栈
                node.pre=self.point
                self.point=node
                # 原栈顶结点入栈
                newnode=Node(temp)
                newnode.pre=self.point
                self.point=newnode
                self.length+=1
            else:
                node.pre=self.point
                self.point=node
        else:
            self.point=node
        self.length+=1

    def pop(self):
        if self.point!=None:
            node=self.point
            self.point=node.pre
            node.pre=None
            self.length-=1
            return node.value

        else:
            return None

    def isempty(self):
        return False if self.length else True



def main():
    minstk=minStack()
    test=[9,1,2,4,5,6,7,11,34,56,33]
    for i in range(len(test)):
        minstk.push(test[i])

    print(minstk.pop())


if __name__ == '__main__':
    main()

4.测试结果

在这里插入图片描述

5.思考

如何实现一个真正意义上的最小栈呢?:栈内元素有序排列,栈顶元素最小。
而且我现在是在模拟一个栈结构,所以在仅使用栈的情况下,应该如何操作呢?
是不是需要一个辅助栈呢?效率会不会很低呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

同学陈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值