【Python数据结构1】栈的应用

栈Stack:什么是栈?

一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端
这一端叫栈“顶top”,另一端叫栈“底base”
日常生活中有很多栈的应用,如:盘子、托盘、书堆等等

❖距离栈底越近的数据项,留在栈中的时间就越长,而最新加入栈的数据项会被最先移除
❖这种次序通常称为后进先出LIFO:Last in First out
这是一种基于数据项保存时间的次序,时间越短的离栈顶越近,而时间越长的离栈底越近
❖❖❖抽象数据类型“栈”定义为如下的操作:
Stack():创建一个空栈,不包含任何数据项
push(item):将item加入栈顶,无返回值
pop():将栈顶数据项移除,并返回,栈被修改
peek():“窥视”栈顶数据项,返回栈顶的数据项但不移除,栈不被修改
isEmpty():返回栈是否为空栈
size():返回栈中有多少个数据项
抽象数据类型Stack:操作样例

另外

python列表(list)就具有栈的特性,其函数与栈中相对应的函数功能类似,故可以直接把list当做栈来使用,也可以利用list构建Stack类

栈代码示例

class Stack:def __init__(self):self.items=[]def isEmpty(self):return  self.items==[]def push(self,item):self.items.append(item)def pop(self):return self.items.pop()def peek(self):return self.items[len(self.items)-1]def size(self):return len(self.items)

示例1:进制转换

直接使用list做为栈

def HexConv(decNumber,base):dights=[str(i) for i in range(10)]+[chr(i) for i in range(65,72)]remstack=[]while decNumber>0:rem=decNumber%baseremstack.append(dights[rem])decNumber//=baseres=""while remstack!=[]:res+=remstack.pop()return resif __name__ == '__main__':n=int(input("请输入原数:"))hex=int(input("目标进制:"))print("十进制{}转换为{}进制结果:{}".format(n,hex,HexConv(n,hex)))

示例2:括号匹配

引入Stack类

from stack_set import Stackdef bracMatch(bracketItem):bracketList = list(bracketItem)braStack = Stack()leftbrac = "{[("rightbrac = "}])"result = Truefor item in bracketList:if item in leftbrac:braStack.push(item)elif item in rightbrac:if braStack.isEmpty():result = Falseelse:# peek函数取栈顶元素,判断栈顶元素是否跟右括号相对应if matchBoth(braStack.peek(), item):braStack.pop()else:result = Falseif braStack.isEmpty() and result:result = Trueelse:result = Falsereturn resultdef matchBoth(item1, item2):leftbrac = "{[("rightbrac = "}])"return leftbrac.index(item1) == rightbrac.index(item2)if __name__ == "__main__":str = input("请输入表达式")if bracMatch(str):print("括号匹配")else:print("括号不匹配")

示例3:中缀表达式转为后缀表达式

from stack_set import Stackdef infixToPostfix(infixpr):pre={}pre['*'],pre['/']=3,3pre['+'],pre['-']=2,2pre['(']=1charlist=[chr(i) for i in range(65,91)]numlist=[i for i in range(10)]# 生成一个用于存储符号的栈和一个用于存储值的列表opstack=Stack()postfixlist=[]items=infixpr.split()for item in items:# 判断是否为表达式中的值if item in charlist or item in numlist:postfixlist.append(item)elif item=="(":opstack.push(item)elif item==')':tokentop=opstack.pop()while tokentop!="(":postfixlist.append(tokentop)tokentop=opstack.pop()else:# 当栈非空时,入栈的符号要先检查其是否满足入栈优先级while(not opstack.isEmpty()) and (pre[item]<=pre[opstack.peek()]):postfixlist.append(opstack.pop())opstack.push(item)print("stack:{},postlist:{}".format(opstack.items,postfixlist))# 最后将栈中元素出栈(进栈前已考虑优先级,出栈直接出)while not opstack.isEmpty():postfixlist.append(opstack.pop())return "".join(postfixlist)
if __name__ == '__main__':infix="A + ( B * C )"postfix=infixToPostfix(infix)print("其对应的后缀表达式:{}".format(postfix))

读者可自行体会直接使用list与构建stack的区别

参考:MOOC陈斌老师

Python数据结构:栈的应用相关推荐

  1. python数据结构-栈的实现

    文章目录 前言 一.栈的特点 二.python实现栈 三.栈应用举例--匹配括号 前言 栈有时也被称为"下推栈",它是一种有序集合,且添加和一处操作总发生在同一端,一般将其称之为顶 ...

  2. python数据结构-栈(stack)

    栈 栈是一种特殊的线性表,其插入删除操作只能在表的尾部进行 在栈中允许进行插入删除的操作的一端为栈顶,另一端为栈底 栈的插入叫做入栈,栈的删除叫做出栈 栈是先进后出,类似往箱子里放衣服,先放进来的衣服 ...

  3. Python数据结构——栈、队列的实现(一)

    1. 栈 栈(Stack)是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端,称为栈的顶(top).栈的基本操作有PUSH(入栈)和POP(出栈).栈又被称为LIFO(后入先出)表. 1.1 ...

  4. Python数据结构栈,后进先出

    栈,后进先出LIFO

  5. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  6. Python数据结构学习笔记——栈

    目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...

  7. Python 数据结构之栈的实现

    文章目录 栈的概念 栈的特点 栈的操作 Python 实现栈 栈的简单应用:括号匹配问题 栈的简单应用:倒序输出一组元素 栈的概念 栈(stack)又名堆栈,栈是一种线性数据结构,用先进后出或者是后进 ...

  8. python数据结构-数组/列表/栈/队列及实现

    首先 我们要分清楚一些概念和他们之间的关系 数组(array)  表(list)  链表(linked list)  数组链表(array list)   队列(queue)  栈(stack) li ...

  9. Python数据结构与算法(二)栈和队列

    本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...

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

    Python数据结构与算法(3.1)--栈 0. 学习目标 1. 栈的基本概念 1.1 栈的基本概念 1.2 栈抽象数据类型 1.3 栈的应用场景 2. 栈的实现 2.1 顺序栈的实现 2.2 链栈的 ...

最新文章

  1. [微信小程序]提交表单返回成功后自动清空表单的值
  2. 网页缩放zoom用法
  3. 交换机端口与mac_address的绑定
  4. 60%收入来自海外,VC追着投资,这匹千里马如此回答“AI往何处去”
  5. html 清除float,css中如何清除float
  6. 从事前端开发必须要了解的CSS原理
  7. 随机生成关于银行卡号的字典(卡号以6102009开头,后面依次是001,002,...)
  8. Oracle自制数据仓库,自治数据库:Oracle 的自治数据仓库云-ADWC体验
  9. Ubuntu 安装Samba(Linux与Windows共享文件)
  10. 用EViews做时间序列SARIMA模型的傻瓜操作小记
  11. python银行排队系统仿真_单片机实现银行排队叫号系统Proteus仿真
  12. ctfmon.exe频繁出错的一个解决办法
  13. 服务器机械硬盘坏了怎么修复,硬盘修复软件:如何修复硬盘错误?
  14. html如何用表格做二级菜单栏,Excel表格制作二级下拉菜单步骤
  15. thinkpadX1C2021充不进去电(去除静电后依旧无效的来看看)
  16. tebsorflow2.0 卷积神经网络的实现实例
  17. 强化学习王者荣耀项目修改
  18. 怎么做ssl证书配置?
  19. [Realtek sdk-4.4.x ]RTL8198D+RTL8192F+RTL8812F WiFi 信道、频宽、加密方式、SSID设置(WPA/WPA/WPA3加密方式)
  20. BZOJ3387栅栏(另一种解法:spfa)

热门文章

  1. 新纪元出纳专用软件 v5.5 绿色
  2. rust如何在木板上上传图片_4.7. 在 crates.io 上发布
  3. 除了外观都已截然不同 — 新 MateBook X Pro 评测
  4. SSH第一步:让自己的程序跑起来
  5. 彭涛:普通人如何通过个人 IP变现?
  6. 尽管颓废了一年,但我仍未放弃梦想「2021年终总结」
  7. 略举Excel实用技巧
  8. 主题 06:如何高效地排查 Java 系统异常
  9. C51---12 AT24C02 (I2C总线)
  10. 区块链招聘报告:平均薪资10.5万美元;伦敦需求最大