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

学习第九天-栈

  1. 栈的定义:栈是一种线性表数据结构,仅允许在表的一端(栈顶)进行插入(入栈)和删除(出栈)操作。没有数据元素时为「空栈」,遵循「后进先出(LIFO)」原则。
  2. 栈的存储方式
    • 顺序栈:利用地址连续的存储单元存放元素,用指针top指示栈顶位置,可借助 Python 的列表实现。
    • 链式栈:通过单链表实现,元素插入到链表首个节点前,top指向链表头节点。
  3. 栈的基本操作:包括初始化空栈、判断栈是否为空、判断栈是否已满(仅适用于顺序栈)、插入元素、删除元素和获取栈顶元素。
  4. 栈的应用:常作为辅助存储结构保存和取用信息,如函数调用栈、浏览器前进后退功能;利用后进先出规则保证特定存取顺序,如翻转元素顺序、铁路列车车辆调度,还可用于判断有效括号等问题。

优化内容

栈的定义与概念

栈(Stack),也被称为堆栈,是一种特殊的线性表数据结构。它有两个关键特征:一是操作的限制性,只允许在表的一端进行数据的插入和删除操作,这一端被称作「栈顶(top)」,而另一端则是「栈底(bottom)」;二是遵循「后进先出(Last In First Out,简称 LIFO)」原则。当栈中没有任何数据元素时,我们称其为「空栈」 。

在栈中,插入操作也叫「入栈」或「进栈」,删除操作则叫「出栈」或「退栈」。从线性表的角度看,栈中元素存在前驱后继的线性关系,元素按顺序进栈,栈顶元素是最后进栈的那个。从后进先出原则来说,每次出栈删除的都是当前栈顶元素,最先进入的元素位于栈底,最后进入的在栈顶。

栈的存储方式

  1. 顺序栈:顺序栈是栈的顺序存储结构,它利用一组地址连续的存储单元,从栈底到栈顶依次存放元素。通过一个指针top来指示栈顶元素在顺序栈中的位置。在 Python 中,借助列表(list)就可以方便地实现顺序栈。列表的特性使其能够很好地模拟顺序栈的操作,利用列表的索引和内置方法,能轻松完成元素的入栈和出栈等操作。
  2. 链式栈:链式栈采用单链表的方式实现栈。在链式栈中,元素按照插入顺序,依次插入到链表的第一个节点之前,栈顶指针top始终指向链表的头节点位置。这种存储方式的优势在于,插入和删除操作无需移动大量元素,效率较高,尤其适用于频繁进行插入和删除操作的场景。
栈的基本操作

  1. 初始化空栈:创建一个空栈时,需要定义栈的大小size(在顺序栈中用于判断栈是否已满),同时设置栈顶元素指针top,通常初始时top指向栈底(在顺序栈中可能是 - 1 或 0,具体取决于实现方式;在链式栈中可能是None)。
  2. 判断栈是否为空:该操作用于检查栈中是否有元素。当栈为空时,返回True;栈不为空时,返回False。在栈的删除操作和获取当前栈顶元素操作前,通常需要先判断栈是否为空,以避免空指针异常或其他错误。
  3. 判断栈是否已满:此操作仅适用于顺序栈。当栈中的元素数量达到预先设定的栈大小时,返回True,表示栈已满;否则返回False。在顺序栈插入元素前,需判断栈是否已满,防止栈溢出;在获取栈顶元素操作时,也可能需要判断栈是否已满,以确保操作的正确性。
  4. 插入元素(进栈、入栈):这一操作相当于在线性表的末尾添加一个新的数据元素。在顺序栈中,先将新元素放入top指针所指位置,然后top指针上移;在链式栈中,创建新节点,将其插入到链表头节点之前,并更新top指针指向新节点。
  5. 删除元素(出栈、退栈):该操作类似在线性表末尾删除最后一个数据元素。顺序栈中,先取出top指针所指元素,然后top指针下移;链式栈中,删除头节点(即栈顶元素),并更新top指针指向下一个节点。
  6. 获取栈顶元素:获取栈顶元素的操作与插入和删除不同,它不会改变栈顶指针top的位置。顺序栈中,直接返回top指针所指元素;链式栈中,返回头节点(栈顶元素)的值。
栈的应用

栈在算法和程序中应用广泛,主要体现在两个方面:

  1. 辅助存储结构:栈能够方便地保存和取用信息,常被用作算法和程序中的辅助存储结构。例如,在操作系统中,函数调用栈用于记录函数调用的相关信息,包括函数参数、局部变量等。当一个函数被调用时,其相关信息入栈;函数执行结束后,这些信息出栈。在浏览器中,前进和后退功能也是借助栈来实现的,浏览过的页面地址按顺序入栈,通过栈操作实现页面的回溯和前进。
  2. 保证特定存取顺序:基于栈的后进先出规则,可以保证特定的存取顺序。比如,在翻转一组元素的顺序时,将元素依次入栈,再依次出栈,就能得到翻转后的顺序。在铁路列车车辆调度场景中,利用栈的特性可以实现对列车车厢的合理调度,提高调度效率。

以判断有效的括号这道简单的算法题为例,给定一个只包含(){}[]的字符串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 };// ✅ 自动推断&#xff…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...