学习第九天-栈
- 栈的定义:栈是一种线性表数据结构,仅允许在表的一端(栈顶)进行插入(入栈)和删除(出栈)操作。没有数据元素时为「空栈」,遵循「后进先出(LIFO)」原则。
- 栈的存储方式
- 顺序栈:利用地址连续的存储单元存放元素,用指针
top
指示栈顶位置,可借助 Python 的列表实现。 - 链式栈:通过单链表实现,元素插入到链表首个节点前,
top
指向链表头节点。
- 顺序栈:利用地址连续的存储单元存放元素,用指针
- 栈的基本操作:包括初始化空栈、判断栈是否为空、判断栈是否已满(仅适用于顺序栈)、插入元素、删除元素和获取栈顶元素。
- 栈的应用:常作为辅助存储结构保存和取用信息,如函数调用栈、浏览器前进后退功能;利用后进先出规则保证特定存取顺序,如翻转元素顺序、铁路列车车辆调度,还可用于判断有效括号等问题。
优化内容
栈的定义与概念
栈(Stack),也被称为堆栈,是一种特殊的线性表数据结构。它有两个关键特征:一是操作的限制性,只允许在表的一端进行数据的插入和删除操作,这一端被称作「栈顶(top)」,而另一端则是「栈底(bottom)」;二是遵循「后进先出(Last In First Out,简称 LIFO)」原则。当栈中没有任何数据元素时,我们称其为「空栈」 。
在栈中,插入操作也叫「入栈」或「进栈」,删除操作则叫「出栈」或「退栈」。从线性表的角度看,栈中元素存在前驱后继的线性关系,元素按顺序进栈,栈顶元素是最后进栈的那个。从后进先出原则来说,每次出栈删除的都是当前栈顶元素,最先进入的元素位于栈底,最后进入的在栈顶。
栈的存储方式
- 顺序栈:顺序栈是栈的顺序存储结构,它利用一组地址连续的存储单元,从栈底到栈顶依次存放元素。通过一个指针
top
来指示栈顶元素在顺序栈中的位置。在 Python 中,借助列表(list)就可以方便地实现顺序栈。列表的特性使其能够很好地模拟顺序栈的操作,利用列表的索引和内置方法,能轻松完成元素的入栈和出栈等操作。 - 链式栈:链式栈采用单链表的方式实现栈。在链式栈中,元素按照插入顺序,依次插入到链表的第一个节点之前,栈顶指针
top
始终指向链表的头节点位置。这种存储方式的优势在于,插入和删除操作无需移动大量元素,效率较高,尤其适用于频繁进行插入和删除操作的场景。
栈的基本操作
- 初始化空栈:创建一个空栈时,需要定义栈的大小
size
(在顺序栈中用于判断栈是否已满),同时设置栈顶元素指针top
,通常初始时top
指向栈底(在顺序栈中可能是 - 1 或 0,具体取决于实现方式;在链式栈中可能是None
)。 - 判断栈是否为空:该操作用于检查栈中是否有元素。当栈为空时,返回
True
;栈不为空时,返回False
。在栈的删除操作和获取当前栈顶元素操作前,通常需要先判断栈是否为空,以避免空指针异常或其他错误。 - 判断栈是否已满:此操作仅适用于顺序栈。当栈中的元素数量达到预先设定的栈大小时,返回
True
,表示栈已满;否则返回False
。在顺序栈插入元素前,需判断栈是否已满,防止栈溢出;在获取栈顶元素操作时,也可能需要判断栈是否已满,以确保操作的正确性。 - 插入元素(进栈、入栈):这一操作相当于在线性表的末尾添加一个新的数据元素。在顺序栈中,先将新元素放入
top
指针所指位置,然后top
指针上移;在链式栈中,创建新节点,将其插入到链表头节点之前,并更新top
指针指向新节点。 - 删除元素(出栈、退栈):该操作类似在线性表末尾删除最后一个数据元素。顺序栈中,先取出
top
指针所指元素,然后top
指针下移;链式栈中,删除头节点(即栈顶元素),并更新top
指针指向下一个节点。 - 获取栈顶元素:获取栈顶元素的操作与插入和删除不同,它不会改变栈顶指针
top
的位置。顺序栈中,直接返回top
指针所指元素;链式栈中,返回头节点(栈顶元素)的值。
栈的应用
栈在算法和程序中应用广泛,主要体现在两个方面:
- 辅助存储结构:栈能够方便地保存和取用信息,常被用作算法和程序中的辅助存储结构。例如,在操作系统中,函数调用栈用于记录函数调用的相关信息,包括函数参数、局部变量等。当一个函数被调用时,其相关信息入栈;函数执行结束后,这些信息出栈。在浏览器中,前进和后退功能也是借助栈来实现的,浏览过的页面地址按顺序入栈,通过栈操作实现页面的回溯和前进。
- 保证特定存取顺序:基于栈的后进先出规则,可以保证特定的存取顺序。比如,在翻转一组元素的顺序时,将元素依次入栈,再依次出栈,就能得到翻转后的顺序。在铁路列车车辆调度场景中,利用栈的特性可以实现对列车车厢的合理调度,提高调度效率。
以判断有效的括号这道简单的算法题为例,给定一个只包含(
)
、{
}
、[
]
的字符串s
,判断字符串是否有效。有效的字符串需满足:左括号必须用相同类型的右括号闭合,且左括号必须以正确的顺序闭合。这道题就可以利用栈来解决,遍历字符串,遇到左括号入栈,遇到右括号时,检查栈顶元素是否与之匹配,若匹配则栈顶元素出栈,否则字符串无效。遍历结束后,若栈为空,则字符串有效,否则无效。
相关文章:
学习第九天-栈
栈的定义:栈是一种线性表数据结构,仅允许在表的一端(栈顶)进行插入(入栈)和删除(出栈)操作。没有数据元素时为「空栈」,遵循「后进先出(LIFO)」原…...

Java基础关键_016_System 类
目 录 一、常用属性 1.static final PrintStream err 2.static final InputStream in 3.static final PrintStream out 二、常用方法 1.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 2.currentTimeMillis() 3.nanoTime() 4. exit(int st…...

计算机毕设JAVA——某高校宿舍管理系统(基于SpringBoot+Vue前后端分离的项目)
文章目录 概要项目演示图片系统架构技术运行环境系统功能简介 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:不同的项目基本上就是套用固定模板,换个颜色、改个文字&…...

【 实战案例篇三】【某金融信息系统项目管理案例分析】
大家好,今天咱们来聊聊金融行业的信息系统项目管理。这个话题听起来可能有点专业,但别担心,我会尽量用大白话给大家讲清楚。金融行业的信息系统项目管理,说白了就是如何高效地管理那些复杂的IT项目,确保它们按时、按预算、按质量完成。咱们今天不仅会聊到一些理论,还会通…...
vivado 避免本地时钟、创建输出时钟
避免本地时钟 本地时钟是使用常规结构资源而不是专用全局时钟资源进行布线的时钟网络。在大多数情况下, Vivado 综合和 Vivado 逻辑优化工具在架构要求的时钟缓存或具有超过 30 个时钟负载的时钟网络中插入时钟缓存。本地时钟通常发生在: • 全局时…...

二十三种设计模式
2 工厂方法模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通…...
uniapp 中引入使用uView UI
文章目录 一、前言:选择 uView UI的原因二、完整引入步骤1. 安装 uView UI2. 配置全局样式变量(关键!)3. 在 pages.json中添加:4. 全局注册组件5. 直接使用组件 五、自定义主题色(秒换皮肤) 一、…...

用冒泡排序法模拟qsort函数
目录 1.前言 2.qsort函数的介绍 3.冒泡法回顾 4.模拟qsort---buble_sort 4.1 buble_sort格式 4.2 主函数,以int类型为例 4.3comp_int函数的功能设计 4.4 swap函数的功能设计 5. 总代码概览 1.前言 今天,小邓儿带大家用冒泡排序法来模拟一下qs…...

DCN讲解
DCN是DeepFM的升级版,后者是只能做二阶交叉特征,随着阶数上升,模型复杂度大幅提高,且FM网络层较浅,表达能力有限。google团队通过构建深度交叉网络来自动进行特征的高阶交叉,且时空复杂度均为线性增长&…...
nginx的作用和应用场景
Nginx 是一款高性能的开源 Web 服务器和反向代理服务器,以其高效处理高并发连接和低资源消耗著称。以下是其核心作用及典型应用场景的详细解析: 一、Nginx 的核心作用 1. 静态资源服务器 功能:直接托管 HTML、CSS、JavaScript、图片等静态文…...

[Lc滑动窗口_1] 长度最小的数组 | 无重复字符的最长子串 | 最大连续1的个数 III | 将 x 减到 0 的最小操作数
目录 1. 长度最小的字数组 题解 代码 ⭕2.无重复字符的最长子串 题解 代码 3.最大连续1的个数 III 题解 代码 4.将 x 减到 0 的最小操作数 题解 代码 1. 长度最小的字数组 题目链接:209.长度最小的字数组 题目分析: 给定一个含有 n 个 正整数 的数组…...

基于python的网络爬虫爬取天气数据及可视化分析(Matplotlib、sk-learn等,包括ppt,视频)
基于Python爬取天气数据信息与可视化分析(文末完整源码) 基于python的网络爬虫爬取天气数据及可视化分析 可以看看演示视频。 摘要 基于Python爬取天气数据信息与可视化分析 本论文旨在利用Python编程语言实现天气数据信息的爬取和可视化分析。天气…...
【缓存】缓存雪崩与缓存穿透:高并发系统的隐形杀手
缓存雪崩与缓存穿透:高并发系统的隐形杀手 在高并发系统中,缓存是提升性能的重要手段。然而,缓存使用不当也会带来一系列问题,其中最常见的就是缓存雪崩和缓存穿透。这两个问题如果不加以解决,可能会导致系统崩溃&…...
HTML AI 编程助手
HTML AI 编程助手 引言 随着人工智能技术的飞速发展,编程领域也迎来了新的变革。HTML,作为网页制作的基础语言,与AI技术的结合,为开发者带来了前所未有的便利。本文将探讨HTML AI编程助手的功能、应用场景以及如何利用它提高编程…...

李宏毅机器学习课程学习笔记04 | 浅谈机器学习-宝可梦、数码宝贝分类器
文章目录 案例:宝可梦、数码宝贝分类器第一步:需要定义一个含有未知数的function第二步:loss of a function如何Sample Training Examples > 如何抽样可以得到一个较好的结果如何权衡模型的复杂程度 Tradeoff of Model Complexity todo 这…...

AIGC(生成式AI)试用 26 -- 跟着清华教程学习 - DeepSeek与AI幻觉
目标:继续学习 个人理解: - AI幻觉:一本正经的胡说八道,你还觉得很道理,倾向于相信;事实不一致,指令(预期)与实际不一致:跑题 - 潜在风险:把AI带坏了;信息误…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_add_dump
ngx_conf_add_dump 定义在src\core\ngx_conf_file.c static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename) {off_t size;u_char *p;uint32_t hash;ngx_buf_t *buf;ngx_str_node_t *sn;ngx_conf_dump_t *cd;has…...
QEMU源码全解析 —— 内存虚拟化(23)
接前一篇文章:QEMU源码全解析 —— 内存虚拟化(22) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 QEMU内存管理模型...

【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…...
TypeScript 类型声明
在 TypeScript 开发中简化类型声明,可以通过以下 7 种实用技巧 显著提升效率: 一、善用类型推断(30% 场景免声明) // ❌ 冗余写法 const user: { name: string; age: number } { name: Jack, age: 25 };// ✅ 自动推断ÿ…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...