当前位置: 首页 > 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…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...