Python中栈的概念和使用

目录

一、引言

二、栈的概念

三、栈的使用

1、创建栈

2、入栈操作

3、出栈操作

4、查看栈顶元素

5、判断栈是否为空

四、应用场景

1、函数调用

2、表达式求值

3、深度优先搜索

4、括号匹配

五、总结


一、引言

栈是一种重要的数据结构,它遵循后进先出(LIFO)的原则。在Python中,栈可以通过内置的list类型实现,也可以使用collections模块中的deque类型来实现。栈在计算机科学和编程中有着广泛的应用,如函数调用、表达式求值、深度优先搜索等。本文将详细介绍Python中栈的概念、使用方法以及应用场景。

二、栈的概念

栈是一种数据结构,它按照后进先出(LIFO)的原则对元素进行存储和访问。栈中的元素只能从一端(称为栈顶)添加或删除。这种特性使得栈在某些情况下非常有用,例如在实现函数调用、表达式求值等功能时。

在Python中,可以使用列表(list)实现栈。由于列表具有动态大小的特点,因此非常适合用于实现栈这种需要动态添加和删除元素的数据结构。

三、栈的使用

1、创建栈

在Python中,可以使用列表(list)创建栈。例如,以下代码创建一个空栈:

stack = []

2、入栈操作

入栈操作是指将元素添加到栈顶。在Python中,可以使用列表的append()方法实现入栈操作。例如,以下代码将元素1添加到栈中:

stack.append(1)

3、出栈操作

出栈操作是指从栈顶删除元素。在Python中,可以使用列表的pop()方法实现出栈操作。例如,以下代码从栈中删除并返回栈顶元素:

top_element = stack.pop()

4、查看栈顶元素

查看栈顶元素是指获取栈顶元素但不删除它。在Python中,可以使用列表的[-1]索引来获取栈顶元素。例如,以下代码查看并打印栈顶元素:

top_element = stack[-1]  
print(top_element)

5、判断栈是否为空

判断栈是否为空是指检查栈是否为空。在Python中,可以使用列表的len()方法来检查栈的大小。例如,以下代码检查并打印栈是否为空:

is_empty = len(stack) == 0  
print(is_empty)

四、应用场景

1、函数调用

在函数调用过程中,可以使用栈来保存函数的局部变量和参数。当函数被调用时,将参数和局部变量压入栈中;当函数返回时,从栈中弹出参数和局部变量。这样就可以保证函数调用的正确性和可重复性。例如:

def add(a, b):  return a + b  stack = []  
stack.append(2)  
stack.append(3)  
result = add(*stack)  # 使用*运算符将栈中的元素作为参数传递给add函数  
print(result)  # 输出5

2、表达式求值

在表达式求值过程中,可以使用栈来保存操作数和运算符。当遇到操作数时,将其压入栈中;当遇到运算符时,从栈中弹出操作数进行计算,并将结果压入栈中。这样就可以按照后进先出的原则对表达式进行求值。例如:

def evaluate_expression(expression):  stack = []  for token in expression:  if token.isdigit():  # 如果当前元素是数字,则将其压入栈中  stack.append(int(token))  else:  # 如果当前元素是运算符,则从栈中弹出两个操作数进行计算,并将结果压入栈中  right_operand = stack.pop()  left_operand = stack.pop()  if token == '+':  result = left_operand + right_operand  elif token == '-':  result = left_operand - right_operand  elif token == '*':  result = left_operand * right_operand  elif token == '/':  result = left_operand / right_operand  stack.append(result)  return stack[0]  # 返回最终结果(位于栈顶)

3、深度优先搜索

在深度优先搜索(DFS)中,可以使用栈来保存待访问的节点。当遇到一个节点时,将其压入栈中;当栈不为空时,从栈顶弹出一个节点进行访问。这样就可以按照后进先出的原则进行深度优先搜索。例如:

def dfs(graph, start):  stack = []  visited = set()  stack.append(start)  while stack:  vertex = stack.pop()  if vertex not in visited:  visited.add(vertex)  stack.extend(graph[vertex] - visited)  return visited

4、括号匹配

在括号匹配问题中,可以使用栈来检查输入的括号是否匹配。当遇到左括号时,将其压入栈中;当遇到右括号时,从栈顶弹出一个左括号进行匹配。如果栈为空或弹出的左括号与右括号不匹配,则说明输入的括号不匹配。例如:

def is_balanced(s):  stack = []  for char in s:  if char in ('(', '{', '['):  stack.append(char)  elif char in (')', '}', ']'):  if not stack or stack[-1] != char:  return False  else:  stack.pop()  return not stack

五、总结

本文介绍了Python中栈的概念和使用方法,包括创建栈、入栈操作、出栈操作、查看栈顶元素以及判断栈是否为空等基本操作。同时,还介绍了栈在函数调用、表达式求值、深度优先搜索以及括号匹配等应用场景中的应用。通过掌握栈的概念和基本操作,我们可以更加灵活地处理各种问题,提高编程效率。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure元件基本介绍进阶

Axure元件基本介绍进阶 1.Axure元件基本介绍1.在 Axure 中,元件是构建原型的基本构成单元,能够帮助设计师快速创建、重复使用和管理设计元素。以下是 Axure 中元件的基本介绍:1.基本元件: 2.基本元件的使用一.【举例说明】积木&am…

Qt提升绘制效率,绘制加速。

在我们绘制一些复杂逻辑且数据量巨大的图形时,经常会出现流畅性问题,本文就是来进行讲解如何提升绘制效率的。 实现思路: 场景1:我们绘制多个静态图形和绘制一张图片哪个更快。很明显绘制多个图形的时候要慢很多。所以我们将多个图…

【二分查找】【区间合并】LeetCode2589:完成所有任务的最少时间

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 有序向量的二分查找,向量只会在尾部增加删除。 题目 你有一台电脑,它可以 同时 运行无数个任务。给你一个二维整数数组 tasks ,其中 ta…

圣诞节酷炫特效合集【含十几个HTML+CSS前端特效+34个桌面酷炫圣诞程序】

写在前面 ❤️源码获取:订阅后见文末 ❤️内容介绍:包含HTML+CSS等十几个圣诞特效;以及三十四个桌面酷炫圣诞树合集 ❤️订阅后所得如下: ❤️HTML圣诞+桌面圣诞程序效果如下: 下方展示代码仅举例其中几个 所有效果源码及文件订阅后找博主获取即可 🎄css3圣诞雪人动…

基于python的大数据分析与应用环境的搭建

一、主要目的: 初步熟悉Python数据分析工具,通过查阅相关说明文档掌握Numpy、Scipy和Pandas包的基本使用方法。对于不同形式的源数据文件,能够基于python开发环境正确的完成数据导入。 二、主要内容: 1、Python开发环境安装以及…

阿里云国际跨境直播解决方案,视频AI创新营销模式丰富直播场景

据第三方咨询公司iiMedia Research预测,2017-2020年,视频直播行业一直处于高速发展阶段。2020年,视频直播行业市场收入超1万亿元,累计覆盖用户5.26亿。 视频直播的应用范围已从视频娱乐、电子商务等泛互联网行业扩展到在线教育、…

分布式数据库 GaiaDB-X 金融应用实践

1 银行新一代核心系统建设背景及架构 在银行的 IT 建设历程中,尤其是中大行,大多都基于大型机和小型机来构建核心系统。随着银行业务的快速发展,这样的系统对业务的支持越来越举步维艰,主要体现在以下四个方面: 首先…

[C++] 继承

文章目录 1、继承的概念及定义1.1 继承的概念1.2 继承的定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 2、基类和派生类对象赋值转换3、继承中的作用域4、派生类的默认成员函数5、继承与友元6、继承与静态成员7、菱形继承,菱形虚拟…

centOS 64位安装node_exporter

下载node_exporter 我是在这里https://prometheus.io/download/#node_exporter下载到自己电脑,然后使用rz命令传到linux上的。 关于rz命令的使用可看我的这个文章linux上传下载文件lrzsz 解压 tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz将执行文件移动到b…

数据中心到底是如何工作的?

数字时代的数据中心,就如同网络世界的心脏,它的鼓动关系到整个网络生态的运转。但这个复杂而庞大的数据枢纽背后隐藏着怎样的精密机制,是许多人颇感好奇的谜。 数字时代的数据中心,就如同网络世界的心脏,它的鼓动关系…

Python爬虫实战 | 爬取拼多多商品的详情价格SKU数据

本案例将为大家演示如何爬取拼多多商品的详情数据。目的是爬取大量的商品以及商品的评论,所以在程序设计上要考虑到该爬虫的高并发以及持久化存储。爬虫工具选用了Scrapy框架,以满足爬虫的高并发请求任务;持久化存储用了MongoDB,对…

Epicypher—CUTANA™ ChIC/CUTRUN Kit

核酸酶靶向切割和释放 (CUT&RUN)技术是由Steven henikoff博士团队开发的一种染色质图谱分析方法,基于Ulrich Laemmli博士的染色质免疫切割技术 (ChIC),融合蛋白A与微球菌核酸酶 (pA-MNase),选择性原位切割与抗体结合的染色质。在CUT&…

哪些因素影响转本复习效率?

一、精简资料 很多同学会搜集大量资料进行复习,在一轮轮复习之后你会很容易发现自己重复复习了大量内容和试题。 还有些同学将自己有限的精力和时间投入庞大的题海中,花费了大量的时间,但得到的提升不多。 同学们在脑海里一定要有清晰的认…

linux串口数据丢失--中断绑定CPU优化

问题现象 机器在户外测试时, 出现 轮速记 丢失的现象 小概率出现 50Hz丢失1~2帧极低概率出现 0.1~0.3秒内没有底盘数据 此问题导致slam定位漂, 需要优化处理. 验证与测试 问题1: 底盘串口 一个数据帧(head–data–crc) 被分片2~3报文 解决方法: 检测到head之后, 解析data…

MYSQL练题笔记-子查询-部门工资前三高的所有员工

这个系列的最后一个,也是所有的50题的第一个困难题,看着就有点吓人啧啧啧。 一、题目相关内容 1)相关的表和题目 2)帮助理解题目的示例,提供返回结果的格式 二、自己初步的理解 将每个部门分组,然后用ra…

搬运机器人行业分析:中国市场销量已达到6.3万台左右

近年来,随着我国人口红利的逐渐消失,企业用工成本不断上涨,各种工业机器人获得了广泛的应用。焊接、装配、切割、分拣、搬运等机器人的出现,不仅通过“机器换人”解放了企业和行业的生产力,更推动了产业发展由劳动密集…

Flink 有状态流式处理

传统批次处理方法 【1】持续收取数据(kafka等),以window时间作为划分,划分一个一个的批次档案(按照时间或者大小等); 【2】周期性执行批次运算(Spark/Stom等)&#xff1b…

MongoDB表的主键可以重复?!MongoDB的坑

MongoDB表的主键可以重复?! 眼见为实? 碰到一个奇怪的现象, MongoDB的一个表居然有两个一样的_id值! 再次提交时,是会报主键冲突的。那上图,为什么会有两个一样的_id呢? 将它们的…

C++刷题 -- 哈希表

C刷题 – 哈希表 文章目录 C刷题 -- 哈希表1.两数之和2.四数相加II3.三数之和(重点) 当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法; 1.两数之和 https://leetcode.cn/problems/two…

深入源码解析ArrayList:探秘Java动态数组的机制与性能

文章目录 一、 简介ArrayList1.1 介绍ArrayList的基本概念和作用1.2 与数组的区别和优势 二、 内部实现2.1 数据结构:动态数组2.2 添加元素:add()方法的实现原理2.3 扩容机制:ensureCapacity()方法的实现原理 三、 常见操作分析3.1 获取元素&…