数据结构与算法——栈(python详细版附带例子)

数据结构与算法(python)(数据结构) 整理了数据结构的基础内容,包括列表、栈和队列、链表、哈希表和树的相关知识点 阅读详情

author:小黄
缓慢而坚定的生长


栈

栈是由一系列对象组成的一个集合,这些对象的插入和删除遵循后进先出(LIFO)的原则。其基本结构如下图所示,
在这里插入图片描述
栈是最简的数据结构,但同样也是最重要的书籍结构。


用S表示一个栈,其基本的一些函数如下:

  • S.push(a):将一个元素a添加到栈S的栈顶;
  • S.pop():从栈S中移除并返回该元素,如果此时栈是空的,则返回一个错误;
  • S.top():返回栈顶元素但并不移除,就是说看栈顶的元素值,如果栈为空,则返回一个错误;
  • S.isEmpty():如果是空栈,则返回“True”,否则“False”;
  • S.len():返回栈S中元素的数量。

下面用一个例子讲解一下栈的相关操作:
在这里插入图片描述
看完这个例子,相信你们对这个栈有了进一步的了解,下面将用函数来带你们了解栈。

基于数组的栈实现

可以通过在python列表中存储一些元素来实现一个栈;用到的相关函数有:append()、pop()、len()
详细代码如下:

class ArrayStack:

    def __init__(self):
        # 创建一个空栈
        self._data = []
    
    def __len__(self):
        # 返回栈中的元素数量
        return len(self._data)

    def isEmpty(self):
        # 如果栈为空则返回“True”
        return len(self._data) == 0
    
    def push(self,a):
        # 向栈顶添加元素a
        self._data.append(a)

    def pop(self):
        # 移除栈顶的元素并返回,如果栈为空,则返回一个错误
        if self.isEmpty():
            raise Exception('Stack is empty')
        return self._data.pop()

    def top(self):
        # 返回栈顶的元素但不移除,如果栈为空,则返回一个错误
        if self.isEmpty():
            raise Exception('Stack is empty')
        return self._data[-1]

复杂度分析:

操作运行时间
S.push(a)O(1)
S.pop()O(1)
S.top()O(1)
S.isEmpty()O(1)
S.len()O(1)

例1:()匹配问题

每个开始符合必须与其相对应的结束符合相匹配:

  • 正确 ()(())
  • 错误 ()()(
  • 错误 ()())

完整代码如下:

class ArrayStack:

    def __init__(self):
        # 创建一个空栈
        self._data = []
    
    def __len__(self):
        # 返回栈中的元素数量
        return len(self._data)

    def isEmpty(self):
        # 如果栈为空则返回“True”
        return len(self._data) == 0
    
    def push(self,a):
        # 向栈顶添加元素a
        self._data.append(a)

    def pop(self):
        # 移除栈顶的元素并返回,如果栈为空,则返回一个错误
        if self.isEmpty():
            raise Exception('Stack is empty')
        return self._data.pop()

    def top(self):
        # 返回栈顶的元素但不移除,如果栈为空,则返回一个错误
        if self.isEmpty():
            raise Exception('Stack is empty')
        return self._data[-1]


def parCheck(s):
    # s是字符串类型
    a = ArrayStack()
    balance = True # 这是标记
    for i in  s:
        if i == '(':
            a.push(i)
        else:
            if a.isEmpty():
                balance = False
                break
            else:
                a.pop()
    if a.isEmpty() and balance:
        return True
    else:
        return False
    

例2:{}匹配问题

  • 正确 (){}[]
  • 错误 {}[(])
class ArrayStack:

    def __init__(self):
        # 创建一个空栈
        self._data = []
    
    def __len__(self):
        # 返回栈中的元素数量
        return len(self._data)

    def isEmpty(self):
        # 如果栈为空则返回“True”
        return len(self._data) == 0
    
    def push(self,a):
        # 向栈顶添加元素a
        self._data.append(a)

    def pop(self):
        # 移除栈顶的元素并返回,如果栈为空,则返回一个错误
        if self.isEmpty():
            raise Exception('Stack is empty')
        return self._data.pop()

    def top(self):
        # 返回栈顶的元素但不移除,如果栈为空,则返回一个错误
        if self.isEmpty():
            raise Exception('Stack is empty')
        return self._data[-1]

def isright(s):
    left = '{[(' # 注意左右括号的索引要一一对应
    right = '}])'
    a = ArrayStack()
    for i in s:
        if i in left:
            a.push(i)
        elif i in right:
            if a.isEmpty():
                return False
            # 判断此时右括号与当前栈弹出的左括号的索引是否相同
            if right.index(i) != left.index(a.pop()):
                return False
    return a.isEmpty()
数据结构与算法Python版之北大慕课笔记(一) 数据结构与算法一、“变位词”判断问题1. 解法一:逐字检查2. 解法二:排序比较3. 解法三:计数比较二、线性结构linear structure1. 四个线性结构2. 栈的应用三、表达式转换及求值1. 中缀表达式2. 前缀和后缀表达式3. 中缀转换为前缀/后缀表达式3.1 通用的中缀转后缀算法4. 后缀表达式求值 一、“变位词”判断问题 问题描述:变位词是指两个词之间存在组成字母的重新排列关系。... 阅读详情

相关推荐

【Python数据结构与算法笔记day01】数据结构与算法(Python)

文章目录数据结构与算法(Python)Why? 数据结构与算法(Python) Python数据结构与算法 1. 引入概念 1.1. 第一次尝试 1.2. 算法的提出 1.3. 第二次尝试 1.4. 算法效率衡量 1.5. 算法分析 1.6. 常见时间复杂度 1.7. Python内置类型性能分析 1.8. 数据结构 2. 顺序表 2.1. 顺序表的形式 2.2. 顺序表的结构与实现 2.3. ...

汪雯琦的博客 1273

栈的经典例题—数据结构

栈的习题

m0_61963422的博客 1938

数据结构与算法(Python语言实现)算法题目(总集篇)

集合了我学习算法的所有题目,都已经分类归档好!

storyfull 3192

应用栈的python程序实例_栈(Stack)及其应用-Python实现

常见数据结构的Python实现-栈目录 1.1 基本概念1.2 栈的实现1.3 应用(括号匹配)1.4 应用(中缀转后缀-整数)1.5 应用( 中缀转后缀-浮点数) 1) 拆分表达式 2) 中缀转后缀1.6 应用(计算中缀表达式) 1) 计算后缀表达式 2) 计算中缀表达式1. 栈1.1 基本概念栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅...

weixin_39932458的博客 469

Python数据结构与算法(3.1)——栈

栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作的子集,但从数据类型的角度来讲,它们与线性表又有着巨大的不同。本节将首先介绍栈的定义和其不同实现,并且给出栈的一些实际应用。

盼小辉丶的博客 4万+

Python数据结构与算法(3.2)——栈相关应用与习题

我们已经学习了栈的相关概念以及其实现,同时也了解了栈在实际问题中的广泛应用,本节的主要目的是通过栈的相关习题来进一步加深对栈的理解,同时能够利用栈降低一些复杂问题解决方案的时间复杂度。

盼小辉丶的博客 3万+

Python数据结构:栈的应用

【Python数据结构1】栈的应用 栈Stack:什么是栈? ❖一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端 这一端叫栈“顶top”,另一端叫栈“底base” ❖日常生活中有很多栈的应用,如:盘子、托盘、书堆等等 ❖距离栈底越近的数据项,留在栈中的时间就越长,而最新加入栈的数据项会被最先移除 ❖这种次序通常称为后进先出LIFO:Last in First out 这是一种基于数据项保存时间的次序,时间越短的离栈顶越近,而时间越长的离栈底越近 ❖❖❖抽象数据类型“栈”定义为如下的操作:

日拱一卒,功不唐捐 2007

[kriging](一)网上下载的kriging克里金的C++程序的初步调试

笔者在网上下载了一份克里金的C++程序,水平有限,正在逐步地调试中。 初步 克里金法现在在许多软件都已经有集成了,据笔者所知: arcgis : 看过有的arcgis培训视频里面简略介绍了里面的插值方法,有克里金。 surfer :笔者用过这个,效果很好。 gocad :听说有 landmark &jason :研究生时候用的专业的石油物探软件,里面有克里金法,万恶的开始。 pykrig...

FOREST优快云 5612

栈的定义与部分习题讲解

栈 一、栈的定义 ​ 栈是一种只能在一端进行插入和删除操作的线性表,表中只允许进行插入和删除操作的一端称为栈顶。栈顶的当前位置是动态的,栈顶的当前位置是由一个成为栈顶指针的位置指示器来指示。表的另一端称为栈底。当栈中没有元素时,称为空栈,栈的插入操作称为进栈或入栈,栈的删除操作称为出栈或退栈。 如下图时队元素的进栈和出栈操作: 二、栈的特点 ​ 栈的主要特点是 “ 后进先出 ”,即后进栈的元素先出栈。栈也被称为后进先出表 三、栈的存储结构 栈有两种主要的存储结构,即顺序栈和链栈。前者采用顺序存储结构表

weixin_56169816的博客 1252

Transformer在CV里太耗算力?手把手拆解Restormer的MDTA与GDFN模块

本文深度解析了CVPR2022最佳论文提名作品Restormer的创新模块MDTA与GDFN,有效解决了Transformer在计算机视觉领域的高计算复杂度问题。通过通道注意力降维和门控前馈网络设计,Restormer在图像恢复重建任务中显著降低计算量,同时保持高性能,为实时图像处理提供了可行方案。

weixin_30258901的博客 446

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

数据结构与算法之Python实现——栈

用Python实现顺序栈、链栈,括号匹配、中缀表达式转换后缀表达式以及计算后缀表达式等算法,每一步都是详细的讲解,你确定不来看看吗

weixin_62917800的博客 1万+

NB-IoT开发避坑指南:STM32下AT指令状态机的设计与优化

本文深入探讨了在STM32平台上为NB-IoT模组开发时,如何用状态机(FSM)设计替代传统的阻塞式AT指令处理方法。通过构建非阻塞、事件驱动的AT指令引擎,有效解决了系统卡顿、响应迟缓等问题,并详细介绍了状态机的设计、实现与高级优化技巧,助力开发者打造健壮可靠的物联网设备通信核心。

q5r6s7的博客 758

数据结构与算法(python版)

时间复杂度 T(n)时间复杂度,n执行的步数 大O表示法,只记录最显著特征O(n)=nxn

Mr_DaYang的博客 3万+

STM32开发实战--解决STM32CubeMX生成代码时钟初始化卡死问题

本文详细分析了STM32CubeMX生成代码在时钟初始化阶段卡死的问题,提供了多种解决方案,包括简单修改和稳健的等待机制。通过深入探讨HAL库的时钟初始化陷阱及硬件层面的根本原因,帮助开发者快速定位并解决STM32开发中的常见问题。

weixin_26965807的博客 442

电子产品设计中EFT防护的关键技术与实践

本文深入探讨了电子产品设计中EFT(快速瞬变脉冲群)防护的关键技术与实践。文章从EFT干扰的原理入手,系统阐述了通过优化PCB布局与地平面设计、构建电源与信号端口滤波防护电路、精选核心器件以及实施软件容错策略,来构建多层次、系统性的抗干扰防线,助力产品稳定通过严苛的电磁兼容测试。

e4f5g6h的博客 787

数据结构与算法Python版 栈的应用

栈的应用示例:十进制转换成其它进制、中缀表达式转换成后缀表达式,以及利用栈对后缀表达式求值。

分享、交流、合作 1394

SAP S/4HANA 中 RAP 业务对象接口的消费模式

本文探讨了SAP S/4HANA中RAP业务对象接口的消费模式,重点介绍了通过EML直接调用和CDS投影两种Clean Core开发路径。文章分析了BO Interface作为稳定契约的价值,并提供了BAdI集成、OData服务发布等实际场景案例,同时对比了OData V2/V4的技术选型考量,最后强调了ADT向导使用中的DCL权限注意事项。全文旨在帮助开发者构建升级友好的业务对象消费方案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 758

数据结构与算法——队列(python版附带详细例子)

author:xiao黄 缓慢而坚定的生长 队列也是一种基本的数据结构,在队列中的插入和删除都遵循先进先出(First in First out, FIFO)的原则。元素可以在任何时刻进行插入,但是只有在队列最前面的元素才能被删除。 通常将队列中允许插入的一端称为队尾,将允许删除的一端称为队头。 队列的抽象数据类型 对于队列Q而言,有下面的一些基本的方法: Q.enqueue(x):向队列...

小黄的博客 2685

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 149

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

栈 数据结构与算法 python版

一种有次序的数据项集合,在栈中,数据 项的加入和移除都仅发生在同一端 这一端叫栈“顶top”,另一端叫栈“底base”距离栈底越近的数据项,留在栈中的时间 就越长 而最新加入栈的数据项会被最先移除。这种次序通常称为“后进先出LIFO”: Last in First out 这是一种基于数据项保存时间的次序,时间越短 的离栈顶越近,而时间越长的离栈底越近。

jaycyj的博客 2046

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python数据结构与算法-数据结构(列表、栈、队列、链表)

python的数据结构与算法

little_limin的博客 4335

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【数据结构与算法】刷题汇总 Python 版

我的BLOG里写了一部分算法和数据结构,题目都是从网上和书上找的。当然一下这些并不全面,我打算利用今后的时间把各类的算法题都用Python写一遍(因为我主要是用Python),尽可能囊括所有的算法题。写这些题并不是目的,主要还是为了能够提升自己的数据结构和算法的水平,以及码代码的速度和熟练度。所有的代码都提交到了我的 github 上面:冬日新雨的github:数据结构和算法刷题代码下载1、字符串:

dongrixinyu的专栏 2万+

Python数据结构与算法——数据结构(栈、队列)

使用python实现数据结构:栈、队列,以及几个经典问题:括号匹配问题、迷宫问题 还介绍python队列内置模块

qq_63043783的博客 1796

Python数据结构与算法之栈的详解及实例

本项目通过实际代码展示了栈这种基本数据结构的实现及应用,使读者理解栈在实际问题中的重要性,希望对学习数据结构的同学有所帮助。栈有许多应用,尤其在算法中,它可以用来解决问题,如符号匹配、表达式求值以及逆序链表等。:栈是一种线性数据结构,其中元素的插入和删除都只能在同一端进行,称为栈顶。:制作遇到的常见栈问题的视频教程,让学习者更直观地理解栈的使用。:使用链栈将链表元素压入栈,然后再从栈中依次弹出构建新的链表。:可以考虑增加其他高级栈特性,例如最小值栈、最大值栈。链表重排可以通过栈实现,将链表中的元素反转。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1074

数据结构与算法(python版)之栈

数据结构与算法(python版)之栈一、什么是栈二、栈的特性:反转特性三、栈的6个基本操作四、用python实现ADT Stack1.思路:2.实现细节:3.代码实现:五、栈的应用一:括号匹配1.括号平衡规则2.思路3.程序流程图 一、什么是栈   抽象数据类型“栈”是一个有次序的数据集,每一个数据仅从“栈顶”一端加入到数据集中或从数据集中移除,栈具有后进先出LIFO特性。 二、栈的特性:反...

weixin_43951995的博客 753
上一篇: 试题 算法提高 最大乘积(python)
下一篇: 数据结构与算法——队列(python版附带详细例子)
xiao黄
xiao黄 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域 领域专家: 数据科学与机器学习技术领域 领域专家: 数据科学与机器学习技术领域
博客等级 码龄8年 1万+粉丝 250原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

xiao黄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值