文章目录

  • 栈的概念
  • 栈的特点
  • 栈的操作
  • 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 数据结构之栈的实现相关推荐

  1. Python数据结构:栈的应用

    [Python数据结构1]栈的应用 栈Stack:什么是栈? ❖一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端 这一端叫栈"顶top",另一端叫栈"底 ...

  2. python数据结构之栈

    栈 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语: ...

  3. python数据结构-栈和队列的实现

    1.栈(后进先出(last in first out,LIFO)) 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-o ...

  4. Python数据结构实战—栈(Stack)

    文章目录 1.栈的性质(后进先出) 2.使用deque作为栈 3.使用双端队列实现Stack类 1.栈的性质(后进先出) s = [] #定义一个空数组装元素 s.append('https://ww ...

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

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

  6. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

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

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

  8. 数据结构学习笔记:利用Python列表实现栈结构

    数据结构学习笔记:利用Python列表实现栈结构 利用Python列表实现栈结构.有两种实现方式: 1.将列表的末尾(rear)作为栈顶(top) 2.将列表的前端(front)作为栈顶(top) 一 ...

  9. 数据结构之 栈 (Python 版)

    数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 1 class SStack(): 2 3 ''' 4 基于顺序表 实现的 栈类 5 ''' 6 ...

最新文章

  1. CVPR2020中关于3D点云分割
  2. Java 编程开始啦
  3. Linux 的 60s USE 性能诊断方法论
  4. 分布式内存数据库---redis配置文件常用配置介绍
  5. orion算法被解密了
  6. 大文件及文件夹上传(续)
  7. 解决 Cmder 的光标跟文字有个间距 及常用配置
  8. 用计算机算出你喜欢吃你喜欢的人,Go for it七年级下学期1-12单元(期末复习)句子翻译专练...
  9. 新视窗java_《计算机组成原理实验》教学大纲 - 兰州大学信息科学与工程学院.DOC...
  10. 最快60秒完成新冠病毒核酸对比 阿里云向社会免费开放基因计算服务
  11. 消费者驱动的契约测试 Spring Cloud Contract介绍
  12. matlab对话框可以改变位置_正压送风口安装好后可以随意改变位置吗?
  13. switch语句训练
  14. 北峰通信为安徽监狱管理局构建无盲区数字对讲通信调度系统
  15. mysql 父子关系查询,父子关系-SQL查询
  16. 企业如何做好品牌推广工作?
  17. Ubuntu 12.04 首个测试版发布
  18. 【绘图】python 配色表
  19. virt-install安装虚拟机
  20. jsp全是问号_JSP response,request中文乱码(出现问号)总结

热门文章

  1. CCTF部分赛题分析
  2. 九度OJ #1437 To Fill or Not to Fil
  3. BZOJ 3479: [Usaco2014 Mar]Watering the Fields( MST )
  4. 原生JS实现淡入淡出效果(fadeIn/fadeOut/fadeTo)
  5. Parallel Extensions CTP第二版发布
  6. 85. Maximal Rectangle
  7. python抓取交易所_Python百行代码抓取美股三大交易所历史数据
  8. php htts cookies,Http和Https下的cookie的写入问题
  9. linux常用计划任务,浅谈:linux cron 计划任务常用符号小结
  10. cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...