基于c++版本链栈改-Python思维总结

##栈部分-(叠猫猫)

##抽象数据类型栈的定义:是一种遵循先入后出的逻辑的线性数据结构。

##栈的链式表示

使用链表实现栈时,我们可以将链表的头结点视为栈顶,尾结点视为栈底。

在进行插入元素的时候我们只需要把结点插入链表的头部,这种方法被称为“头插法”。

在进行删除操作时只需要把头结点删除即可。

##链栈示意图

##图解

##Python链栈代码实现

class ListNode(object):
    """定义链表"""
    def __init__(self):
        self.val = None
        self.next = None

class LinkedListStack:
    """基于链表实现的栈"""

    def __init__(self):
        """构造方法"""
        self._peek:ListNode | None = None
        self._size: int = 0

    def size(self):
        """获取栈的长度"""
        return self._size

    def is_empty(self):
        """判断栈是否为空"""
        return self._size

    def push(self,val):
        """入栈"""
        node = ListNode(val)
        node.next = self._peek
        self._peek = node
        self._size += 1

    def pop(self):
        """出栈"""
        if self.is_empty():
            raise  IndexError("栈为空")
        return self._peek.val

    def to_list(self):
        """转化为列表用于打印"""
        arr = []
        node = self._peek
        while node :
            arr.append(node.val)
            node = node.next
        arr.reverse()
        return arr

时间效率:在基于链表的实现中,链表的扩容非常灵活,不存在上述数组扩容时效率降低的问题。但是,入栈操作需要初始化节点对象并修改指针,因此效率相对较低。不过,如果入栈元素本身就是节点对象,那么可以省去初始化步骤,从而提高效率。

空间效率:由于链表节点需要额外存储指针,因此链表节点占用的空间相对较大

##栈典型的用例

浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就会对上一个网页执行入栈,这样我们就可以通过后退操作回到上一个网页。后退操作实际上是在执行出栈。如果要同时支持后退和前进,那么需要两个栈来配合实现。

程序内存管理。每次调用函数时,系统都会在栈顶添加一个栈帧,用于记录函数的上下文信息。在递归函数中,向下递推阶段会不断执行入栈操作,而向上回溯阶段则会不断执行出栈操作。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值