Python 数据结构之栈的实现
文章目录
- 栈的概念
- 栈的特点
- 栈的操作
- Python 实现栈
- 栈的简单应用:括号匹配问题
- 栈的简单应用:倒序输出一组元素
栈的概念
栈(stack)又名堆栈,栈是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,栈中数据的插入删除操作都是在栈的顶端进行,这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的特点
元素后进先出(Last in First Out,LIFO)
栈的操作
- push(item):进栈(向栈顶添加元素)
- pop():出栈(删除栈顶元素)
- top():查看栈顶元素
- empty():判断栈是否为空
Python 实现栈
栈并不是 Python 的内建类型,在必要的时候可以使用列表来模拟基于数组的栈。如果将列表的末尾看作是栈的顶,列表方法 append()
就是将元素压入到栈中(进栈),而列表方法 pop()
会删除并返回栈顶的元素(出栈),列表索引的方式 arr[-1]
可以查看栈顶元素。具体代码实现如下:
class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if self.empty():return Noneelse:return self.stack.pop()def top(self):if self.empty():return Noneelse:return self.stack[-1]def empty(self):return len(self.stack) == 0
栈的简单应用:括号匹配问题
问题描述:
给定一个字符串,字符串中只包含小括号 ()
、中括号 []
、大括号 {}
,求该字符串中的括号是否匹配。匹配规则:成对出现或者左右对称出现,例如:
()[]{}:匹配;{[()]}:匹配;({}]:不匹配;()]:不匹配;({)}:不匹配
通过栈来解决:
有字符串 ()[{}],依次取每个括号,只要是左括号就进栈,只要是右括号就判断栈顶是否为对应的左括号,具体步骤如下:
- ① 遇到左小括号 (,执行进栈操作;
- ② 遇到右小括号 ),判断此时栈顶是否为左小括号 (,是则让左小括号 ( 出栈,此时栈为空;
- ③ 遇到左中括号 [,执行进栈操作;
- ④ 遇到左大括号 {,执行进栈操作;
- ⑤ 遇到右大括号 },判断此时栈顶是否为左大括号 {,是则让左大括号 { 出栈,此时栈为空;
- ⑥ 遇到右中括号 ],判断此时栈顶是否为左中括号 [,是则让左中括号 [ 出栈,此时栈为空;
- ⑦ 判断最终的栈是否为空,是则表示匹配,不是则表示不匹配。其中第 ② ⑤ ⑥ 步中,若判断为不是,则直接表示不匹配。
Python 代码实现:
class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if self.empty():return Noneelse:return self.stack.pop()def top(self):if self.empty():return Noneelse:return self.stack[-1]def empty(self):return len(self.stack) == 0def brackets_match(s):match_dict = {'}': '{', ']': "[", ')': '('}stack = Stack()for ch in s:if ch in ['(', '[', '{']: # 如果为左括号,则执行进栈操作stack.push(ch)else: # 如果为右括号if stack.empty(): # 如果栈为空,则不匹配,即多了一个右括号,没有左括号匹配return Falseelif stack.top() == match_dict[ch]: # 如果栈顶的元素为对应的左括号,则让栈顶出栈stack.pop()else: # 如果栈顶元素不是对应的左括号,则不匹配return Falseif stack.empty(): # 最后的栈如果为空,则匹配,否则不匹配return Trueelse:return Falseprint(brackets_match('[{()}(){()}[]({}){}]'))
print(brackets_match('()[{}]'))
print(brackets_match('({)}'))
print(brackets_match('[]}'))
输出结果:
True
True
False
False
栈的简单应用:倒序输出一组元素
把元素存入栈,再顺序取出:
class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if self.empty():return Noneelse:return self.stack.pop()def top(self):if self.empty():return Noneelse:return self.stack[-1]def empty(self):return len(self.stack) == 0def reverse_list(s):stack = Stack()for ch in s:stack.push(ch)new_list = []while not stack.empty():new_list.append(stack.pop())return new_listprint(reverse_list(['A', 'B', 'C', 'D', 'E']))
输出结果:
['E', 'D', 'C', 'B', 'A']
Python 数据结构之栈的实现相关推荐
- Python数据结构:栈的应用
[Python数据结构1]栈的应用 栈Stack:什么是栈? ❖一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端 这一端叫栈"顶top",另一端叫栈"底 ...
- python数据结构之栈
栈 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语: ...
- python数据结构-栈和队列的实现
1.栈(后进先出(last in first out,LIFO)) 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-o ...
- Python数据结构实战—栈(Stack)
文章目录 1.栈的性质(后进先出) 2.使用deque作为栈 3.使用双端队列实现Stack类 1.栈的性质(后进先出) s = [] #定义一个空数组装元素 s.append('https://ww ...
- python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...
python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...
- python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt
数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...
- Python数据结构学习笔记——栈
目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...
- 数据结构学习笔记:利用Python列表实现栈结构
数据结构学习笔记:利用Python列表实现栈结构 利用Python列表实现栈结构.有两种实现方式: 1.将列表的末尾(rear)作为栈顶(top) 2.将列表的前端(front)作为栈顶(top) 一 ...
- 数据结构之 栈 (Python 版)
数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 1 class SStack(): 2 3 ''' 4 基于顺序表 实现的 栈类 5 ''' 6 ...
最新文章
- CVPR2020中关于3D点云分割
- Java 编程开始啦
- Linux 的 60s USE 性能诊断方法论
- 分布式内存数据库---redis配置文件常用配置介绍
- orion算法被解密了
- 大文件及文件夹上传(续)
- 解决 Cmder 的光标跟文字有个间距 及常用配置
- 用计算机算出你喜欢吃你喜欢的人,Go for it七年级下学期1-12单元(期末复习)句子翻译专练...
- 新视窗java_《计算机组成原理实验》教学大纲 - 兰州大学信息科学与工程学院.DOC...
- 最快60秒完成新冠病毒核酸对比 阿里云向社会免费开放基因计算服务
- 消费者驱动的契约测试 Spring Cloud Contract介绍
- matlab对话框可以改变位置_正压送风口安装好后可以随意改变位置吗?
- switch语句训练
- 北峰通信为安徽监狱管理局构建无盲区数字对讲通信调度系统
- mysql 父子关系查询,父子关系-SQL查询
- 企业如何做好品牌推广工作?
- Ubuntu 12.04 首个测试版发布
- 【绘图】python 配色表
- virt-install安装虚拟机
- jsp全是问号_JSP response,request中文乱码(出现问号)总结
热门文章
- CCTF部分赛题分析
- 九度OJ #1437 To Fill or Not to Fil
- BZOJ 3479: [Usaco2014 Mar]Watering the Fields( MST )
- 原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)
- Parallel Extensions CTP第二版发布
- 85. Maximal Rectangle
- python抓取交易所_Python百行代码抓取美股三大交易所历史数据
- php htts cookies,Http和Https下的cookie的写入问题
- linux常用计划任务,浅谈:linux cron 计划任务常用符号小结
- cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...