当前位置: 首页 > news >正文

【Python 数据结构 5.栈】

目录

一、栈的基本概念

1.栈的概念

2.入栈

入栈的步骤

3.出栈

出栈的步骤

4.获取栈顶元素

获取栈顶元素的步骤

二、 Python中的栈

顺序表实现

链表实现

三、栈的实战

1.LCR 123. 图书整理 I

思路与算法

2.LCR 027. 回文链表

思路与算法

3.1614. 括号的最大嵌套深度

思路与算法

四、栈的应用


轻舟快船,祝你好过春山

                                —— 25.3.3

一、栈的基本概念

1.栈的概念

        栈是仅限在表尾进行插入和删除的线性表,它遵循后进先出(Last-In-First-Out,LIFO)的原则。栈可以类比为一叠盘子,你只能访问顶部的盘子,而添加或删除盘子只能在顶部进行。在计算机科学中,栈通常用于实现:函数调用、递归、表达式求值 等操作。我们一般可以用 顺序表 或者 链表 来实现栈。


2.入栈

        栈元素的插入操作叫做入栈,也可称为进栈、压栈。直接将元素添加到栈的顶部即可。这个操作类似于将盘子添加到叠盘子的顶部。

入栈的步骤

第1步:将元素压入栈中,并将栈顶指针 或 索引指向新的栈顶元素。

第2步:栈的大小增加了 1,顶部元素为刚刚入栈的元素。


3.出栈

        栈元素的删除操作叫做出栈,也可称为弹栈。直接将栈的顶部元素删除即可。这个操作类似于将叠盘子的顶部的盘子拿走的过程。

出栈的步骤

第1步:将栈顶元素删除掉,并将栈顶指针或索引指向新的顶元素。

第2步:栈的大小减小了 1。


4.获取栈顶元素

        返回栈顶元素的值,无论是链表还是顺序表,都可以通过栈顶指针在 O(1) 的时间复杂度获取到栈顶元素。

获取栈顶元素的步骤

第1步:利用栈顶指针获取栈顶元素,由于是查询操作,所以不会改变栈本身的数据


二、 Python中的栈

顺序表实现

class Stack:def __init__(self):self.data = []# 入栈操作 直接相当于列表的append操作def push(self, val):self.data.append(val)# 出栈操作 直接相当于列表的pop操作def pop(self):if self.empty():return "Stach is empty"return self.data.pop()# 获取栈顶元素 直接相当于列表的索引[-1]操作def top(self):if self.empty():return "Stach is empty"return self.data[-1]def size(self):return len(self.data)def empty(self):return len(self.data) == 0def test():stack = Stack()stack.push(1)stack.push(2)stack.push(3)stack.push(4)while not stack.empty():print(f'Top element: {stack.top()}')print(f'Size of stack: {stack.size()}')print(f'Popped element: {stack.pop()}')print(f'Size of stack: {stack.size()}')print("————————————————————————————")
test()

 


链表实现

class Node:def __init__(self, val):self.val = valself.next = Noneclass Stack:def __init__(self):self.head = Noneself.len = 0# 入栈操作 直接相当于链表的头插法def push(self, val):new_node = Node(val)new_node.next = self.headself.head = new_nodeself.len += 1# 出栈操作def pop(self):if self.empty():return "St ack is empty"val = self.head.valself.head = self.head.nextself.len -= 1return val# 获取栈顶元素 相当于直接返回链表的头节点def top(self):if self.empty():return "Stach is empty"return self.head.valdef size(self):return self.lendef empty(self):return self.len == 0def test():stack = Stack()stack.push(1)stack.push(2)stack.push(3)stack.push(4)while not stack.empty():print(f'Top element: {stack.top()}')print(f'Size of stack: {stack.size()}')print(f'Popped element: {stack.pop()}')print(f'Size of stack: {stack.size()}')print("————————————————————————————")
test()


三、栈的实战

1.LCR 123. 图书整理 I

书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。

示例 1:

输入:head = [3,6,4,1]输出:[1,4,6,3]

提示:

0 <= 链表长度 <= 10000

思路与算法

Ⅰ、栈的使用:代码中使用了栈(Stack)这一数据结构。栈的特点是“后进先出”(LIFO),即最后入栈的元素会最先出栈。利用这一特性,可以将链表中的值依次压入栈中,然后再依次弹出,从而实现反转的效果。

Ⅱ、遍历链表:代码首先通过一个 while 循环遍历链表,将每个节点的值 head.val 压入栈中。遍历结束后,栈中存储了链表所有节点的值,且顺序与链表中的顺序相反。

Ⅲ、反转并生成结果:接着,代码通过另一个 while 循环将栈中的元素依次弹出,并追加到结果列表 res 中。由于栈的 LIFO 特性,弹出的顺序与压入的顺序相反,因此 res 中的元素顺序与链表中的顺序相反,实现了反转的效果。​

Ⅳ、返回结果:最后,代码返回 res,即反转后的链表值列表。

列表.append():用于在列表的末尾添加一个元素。它会直接修改原列表,而不是返回一个新的列表。

参数名说明是否必填
element要添加到列表末尾的元素

列表.pop():用于从列表中移除并返回指定索引处的元素。如果不指定索引,默认移除并返回最后一个元素。

参数名说明是否必填
index要移除的元素的索引(从0开始)
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reverseBookList(self, head: Optional[ListNode]) -> List[int]:# 用Python实现数据结构——栈Stack = []res = []while head != None:Stack.append(head.val)head = head.nextwhile len(Stack) > 0:res.append(Stack.pop())return res


2.LCR 027. 回文链表

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

输入: head = [1,2,3,3,2,1]
输出: true

示例 2:

输入: head = [1,2]
输出: false

提示:

  • 链表 L 的长度范围为 [1, 105]
  • 0 <= node.val <= 9 

思路与算法

Ⅰ、使用栈存储链表的值:首先,函数通过遍历链表,将每个节点的值依次压入栈 Stack 中。由于栈是“后进先出”的数据结构,因此栈中存储的节点顺序是链表节点值的逆序。

Ⅱ、比较链表与栈中的值:接着,函数再次遍历链表,同时从栈中弹出元素,将链表节点的值与栈中弹出的值进行比较。如果所有值都匹配,则链表是回文链表;否则,链表不是回文链表。

列表.append():用于在列表的末尾添加一个元素。它会直接修改原列表,而不是返回一个新的列表。

参数名说明是否必填
element要添加到列表末尾的元素

列表.pop():用于从列表中移除并返回指定索引处的元素。如果不指定索引,默认移除并返回最后一个元素。

参数名说明是否必填
index要移除的元素的索引(从0开始)
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def isPalindrome(self, head: ListNode) -> bool:# 列表逆序也可以用栈Stack = []tmp = headwhile tmp != None:Stack.append(tmp.val)tmp = tmp.nextwhile head:if head.val != Stack.pop():return Falsehead = head.nextreturn True 


3.1614. 括号的最大嵌套深度

给定 有效括号字符串 s,返回 s 的 嵌套深度。嵌套深度是嵌套括号的 最大 数量。

示例 1:

输入:s = "(1+(2*3)+((8)/4))+1"

输出:3

解释:数字 8 在嵌套的 3 层括号中。

示例 2:

输入:s = "(1)+((2))+(((3)))"

输出:3

解释:数字 3 在嵌套的 3 层括号中。

示例 3:

输入:s = "()(())((()()))"

输出:3

提示:

  • 1 <= s.length <= 100
  • s 由数字 0-9 和字符 '+''-''*''/''('')' 组成
  • 题目数据保证括号字符串 s 是 有效的括号字符串

思路与算法

初始化top 初始化为 0,表示当前嵌套深度为 0。res 初始化为 0,用于记录最大嵌套深度。

遍历字符串:对于字符串中的每个字符 x:如果 x 是 "(",表示进入一个新的嵌套层级,因此 top 增加 1,并更新 res 为 max(res, top),以确保 res 始终记录最大深度。如果 x 是 ")",表示退出当前嵌套层级,因此 top 减少 1。

返回结果:遍历结束后,res 即为字符串中嵌套括号的最大深度。

class Solution:def maxDepth(self, s: str) -> int:top = 0res = 0for x in s:if x == "(":top += 1res = max(res, top)elif x == ")":top -= 1return res


四、栈的应用

在打开界面的情况下,打开了一个子界面,关闭子界面,一开始打开的界面还在

打开界面的操作是将界面放在一个栈中,关闭界面的操作就是将界面从栈中移出来,关闭的永远是栈顶部的界面,也就是所谓的 “栈顶” 元素

栈是一个先进后出的数据结构

相关文章:

【Python 数据结构 5.栈】

目录 一、栈的基本概念 1.栈的概念 2.入栈 入栈的步骤 3.出栈 出栈的步骤 4.获取栈顶元素 获取栈顶元素的步骤 二、 Python中的栈 顺序表实现 链表实现 三、栈的实战 1.LCR 123. 图书整理 I 思路与算法 2.LCR 027. 回文链表 思路与算法 3.1614. 括号的最大嵌套深度 思路与算法 …...

Qt开发⑪Qt网络+Qt音视频_使用实操

目录 1. Qt 网络 1.1 UDP Socket 1.2 TCP Socket 1.3 HTTP Client 2. Qt 音视频 2.1 Qt 音频 2.2 Qt 视频 本篇完。 1. Qt 网络 和多线程类似&#xff0c;Qt 为了支持跨平台, 对网络编程的 API 也进行了重新封装。 实际 Qt 开发中进行网络编程&#xff0c;也不一定使用…...

JavaEE--计算机是如何工作的

一、一台计算机的组成部分 1.CPU&#xff08;中央处理器&#xff09; 2.主板&#xff08;一个大插座&#xff09; 3.内存&#xff08;存储数据的主要模板&#xff09; 4.硬盘&#xff08;存储数据的主要模板&#xff09; 内存和硬盘对比&#xff1a; 内存硬盘读写速度快慢存…...

API接口:企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南

API接口&#xff1a;企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南 本文详细介绍一种基于 Web 搜索方式实现的企业信息查询接口&#xff0c;适用于数据补全、企业资质验证、信息查询等场景。文章内容涵盖接口功能、请求参数、返…...

微信小程序text组件decode属性的小问题

今天学习微信小程序的text组件&#xff0c;这个组件类似于网页制作中的span标签&#xff0c;内联文本只能用 text 组件&#xff0c;不能用 view&#xff0c;如 foo bar </text。 text组件常用属性如下表&#xff1a; 属性说明user-select文本是否可选&#xff0c;该属性会使…...

【计算机网络入门】初学计算机网络(九)

目录 1.令牌传递协议 2. 局域网&IEEE802 2.1 局域网基本概念和体系结构 3. 以太网&IEEE802.3 3.1 MAC层标准 3.1.1 以太网V2标准 ​编辑 3.2 单播广播 3.3 冲突域广播域 4. 虚拟局域网VLAN 1.令牌传递协议 先回顾一下令牌环网技术&#xff0c;多个主机形成…...

LeetCode 974:和可被 K 整除的子数组

974. 和可被 K 整除的子数组 - 力扣&#xff08;LeetCode&#xff09; 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的非空 子数组 的数目。 子数组 是数组中 连续 的部分。 示例 1&#xff1a; 输入&#xff1a;nums [4,5,0,-2,-3,1], k …...

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…...

001-码云操作

码云操作 一、配置公钥1.官网地址1.进入 git bash2.查看生成的公钥3.设置到 Gitee4.测试 二、初始化一个项目1.新建仓库 一、配置公钥 方便后续提交代码不用填写密码 1.官网地址 官网地址&#xff1a;https://gitee.com/Git码云教程&#xff1a;https://gitee.com/help/arti…...

数据结构:二叉搜索树(排序树)

1.二叉搜索树的定义 二叉搜索树要么是空树&#xff0c;要么是满足以下特性的树 &#xff08;1&#xff09;左子树不为空&#xff0c;那么左子树左右节点的值都小于根节点的值 &#xff08;2&#xff09;右子树不为空&#xff0c;那么右子树左右节点的值都大于根节点的值 &#…...

【愚公系列】《Python网络爬虫从入门到精通》036-DataFrame日期数据处理

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

C++(蓝桥杯常考点)

前言&#xff1a;这个是针对于蓝桥杯竞赛常考的C内容&#xff0c;容器这些等下棋期再讲 C 在DEVC中注释和取消注释的方法&#xff1a;ctrl/ ASCII值&#xff08;常用的&#xff09;&#xff1a; A-Z:65-90 a-z:97-122 0-9:48-57 换行/n:10科学计数法&#xff1a;eg&#xff1a…...

支付宝 IoT 设备入门宝典(下)设备经营篇

上篇介绍了支付宝 IoT 设备管理&#xff0c;但除了这些基础功能外&#xff0c;商户还可以利用设备进行一些运营动作&#xff0c;让设备更好的帮助自己&#xff0c;本篇就会以设备经营为中心&#xff0c;介绍常见的设备相关能力和问题解决方案。如果对上篇感兴趣&#xff0c;可以…...

蓝桥杯 之 填空题-位运算与循环

文章目录 循环握手问题门牌制作-循环小球反弹幸运数艺术与篮球跑步卡片 位运算3个1美丽的2024 位运算 可以关注这个Lowbit(x) 如何判断最低位是否是1&#xff1f; num&1 1就说明num最低位是1 循环 循环 握手问题 握手问题 思路分析&#xff1a; 可以直接计算出来&…...

iOS逆向工程概述与学习路线图

iOS逆向工程概述与学习路线图 欢迎各位加入我的iOS逆向工程专栏&#xff01;在这个系列的第一篇文章中&#xff0c;我将为大家介绍iOS逆向工程的基本概念、应用场景以及完整的学习路线图&#xff0c;帮助大家建立清晰的学习框架。 什么是iOS逆向工程&#xff1f; 逆向工程&a…...

DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的时间选择器(Time Picker)📚前言📚页面效果📚指令输入…...

基于 Ingress-Nginx 实现 mTLS 双向认证

目录 背景描述&#xff1a; TLS 和 MTLS 之间的差异 通过自签名证书启用双向 TLS 1. 生成证书 (1) 生成 CA&#xff08;根证书颁发机构&#xff09; (2) 生成 CA&#xff08;根证书颁发机构&#xff09; (3) 生成客户端证书 2. 在 Kubernetes 中配置 mTLS &#x…...

学到什么记什么(25.3.3)

Upload-labs 今日重新做了一下文件上传漏洞&#xff0c;这里第一题之前采用直接抓包改后缀名.jpg为.php&#xff0c;再写入一句话<?php phpinfo();?>然后放行&#xff0c;得到图片地址&#xff08;可复制&#xff09;&#xff0c;本来直接访问图片地址即可得到敏感信息…...

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器&#xff1a;Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…...

《解锁HarmonyOS NEXT高阶玩法:艺术图像识别功能开发全攻略》

在当今数字化时代&#xff0c;AI技术不断拓展其应用边界&#xff0c;为各行业带来前所未有的变革。在艺术领域&#xff0c;AI图像识别技术能够帮助艺术从业者、爱好者快速识别艺术品风格、作者&#xff0c;甚至挖掘艺术品背后的历史文化信息。本文将结合HarmonyOS NEXT API 12及…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

Easy Excel

Easy Excel 一、依赖引入二、基本使用1. 定义实体类&#xff08;导入/导出共用&#xff09;2. 写 Excel3. 读 Excel 三、常用注解说明&#xff08;完整列表&#xff09;四、进阶&#xff1a;自定义转换器&#xff08;Converter&#xff09; 其它自定义转换器没生效 Easy Excel在…...