栈和队列:栈

栈的概念:
栈:
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。
栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
- 入栈:栈的插入操作叫做 进栈/压栈/入栈,进入数据在栈顶 。
- 出栈:栈的删除操作叫做出栈。出数据也在栈顶。

后进先出:
入栈和出栈遵循后进先出原则,即处在栈顶的数据先出栈,不处在栈顶的数据不能出栈,简单来说,就是只有处在栈顶的数据才能出栈。

数据模型的转化:
栈分为两种,一种是数组栈,另一种是链式栈,且注意,栈是不分头尾概念的,只分栈顶和栈底
数组栈:

对于数组栈,数组的本质是顺序表,如果需要实现数组栈,则相当于实现顺序表。
且因为栈只分栈顶和栈底,又因为顺序表的尾插操作和尾删操作和其他插入删除操作更为便捷,于是选择顺序表的左边为栈底,顺序表的右侧为栈顶。
链式栈:
对于链式栈,其实就是链表结构的栈,而链表结构的栈分为两种,一种是双向链表,另一种是单链表。
双向链表栈:
双链表具有指向前一个节点的前驱指针和指向后一个节点的后继指针,所以对于栈顶和栈底的划分并不是非常的重要。且如若栈的数量过多,指针也的过多,会导致一定的浪费,所以双向链表模式的栈并不常用。
单链表栈:
对于单链表而言,如果栈顶是尾节点,那么进行出栈就是尾删,但是单链表的尾删十分麻烦,需要头节点进行遍历。
于是便将单链表的栈顶变为头节点,栈底变为尾节点

比较:在链式和数组栈中,最佳的是数组栈,虽然偶尔需要扩容。
数组栈的实现:
从前文得知,数组栈的本质是顺序表,且因为栈是只能从栈顶进行出入,所以数组栈其实就是拥有尾删、尾插、初始化、销毁功能的顺序表。
顺序表:顺序表的简单介绍_明 日 香的博客-CSDN博客

关于top:
- 对于栈的结构体内部,一切都与顺序表的内部十分的相似,不论是存储 栈的地址 a ,还是表示栈的空间大小的capacity 。
- 当然,top 并不是和顺序表中的size 一样表示有效个数的大小。
top 可以有两种表示,一种是表示为栈顶的位置,另一种是表示为栈顶的后面一个元素的位置。
第一种:表示栈顶位置
如果top表示为栈顶的位置,那么在进行初始化的时候,top就不能设置为 top==0
- 0表示数组的下标。
假设,top == 0 而 top 又定义为栈顶所在的位置,那么根据我们的初始化,最初的数组栈是没有栈存在的。
而top 又在下标为0的位置,但是,当我们入栈后,栈顶和栈底都在下标为0的位置。
于是,这就产生了冲突,因为当没有任何栈存在时,top在0的位置,但是当进入一个栈后,top还在0的位置。
那么,top == 0 时,究竟有没有栈的存在呢?这就像薛定谔的猫一样,存在异议。
- 所以,面对这种问题,如果需要将top定义为栈底的位置,那么我们就需要将top的初始值设定为 top == -1
第二种:表示栈顶后的下一个位置。
如果top表示的是 栈顶的下一个位置,那么在初始化时,top==0 可以表示为下一个栈入栈后,栈顶的位置处在下标为0的位置。
关于扩容:
数组栈扩容的原因和顺序表一样,空间的不足需要进行扩容,且因为需要连续的数组,所以当所处的空间不能满足扩容后连续的条件,会进行复制数据转移到新的空间足够,且能连续的空间中。
- 而对于扩容而言,top 也与扩容有着重要的关系。
如果初始化中,top == 0 那么我们需要扩容空间的条件则是 top == capacity
- 也就是,栈顶 的下一个位置的下标等于当前空间的大小时,则表明我们需要进行扩容。
因为 top == 0 表示的意思是下一个入栈的节点 的下标是0 ,又因为数组的下标是从0开始的,所以得出结论,如果空间满了,栈顶因为下标的缘故,栈顶所处在的下标数字比空间大小小一,但空间确是满的!
那么栈顶所处的位置如果下一个位置的下标和空间大小一样,则表明当前空间不够了!
与之相反,如果top == -1 ,则需要top+1才能满足以上的条件。
入栈(尾插):
和顺序表一样,在top的位置插入数据——注意这里的top 表示栈顶的下一个位置下标。

出栈(尾删):
和顺序表的尾删一样,只需要让栈顶减一即可。
同时,出栈的前提是需要有栈的存在,如果top ==0或则top<0 都表示,当前是没有栈存在的,因为top == 0是下一个栈的下标是0,所以top==0是没有栈,而top也是如此,表示的是当前的栈顶是-1负数,表明了没有栈存在。

获取栈顶元素:
初始化 top==0 ,top表示为栈顶后一个位置下标时写法:


相关文章:
栈和队列:栈
栈的概念: 栈: 一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。…...
由浅入深学习统计学 - 常用统计图形学习
学习笔记 第一章- 信息图形化 图形化(可视化) 在一堆数据中,自己发现了这些数据的规律,但是无法表述给其他人知道,图形化就是便于他人理解数据的规律的展示的手段。 或者说我们也可以从统计的数据图形中发现某些没有…...
【java进阶】集合的三种遍历(迭代器、增强for、Lambda)
目录 一、先谈集合: 二、单列集合的三种遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 一、先谈集合: 🔥那我们平常用for循环依赖下标遍历不行嘛,这就与集合的分类有关了。 集合的体系结构: collection是单…...
Qt实现动态桌面小精灵(含源码)
目录 一、设计思路 二、部分源码演示 三、源码地址 🌈write in front🌈 🧸大家好,我是三雷科技.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由三雷科技原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:三雷科技🧸—CSDN博客 🎁欢…...
Qt 自定义分页控件
目录 前言1、功能描述2、代码实现2.1 ui文件2.1 头文件2.2 源码文件2.3 设计思路 4、示例5、总结 前言 在应用程序开发时经常会遇到数据分页的需求,每一页展示特定数量的数据,通过点击按钮翻页或者输入页码跳转到指定页。 本文介绍一个自定义分页控件&a…...
Java中的7大设计原则
在面向对象的设计过程中,首先需要考虑的是如何同时提高一个软件系统的可维护性和可复用性。这时,遵从面向对象的设计原则,可以在进行设计方案时减少错误设计的产生,从不同的角度提升一个软件结构的设计水平。 1、单一职责 一个类…...
Spring Cloud和Kubernetes + Spring Boot 用哪个?
Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案,它们各有优势和不足,选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架,它提供了一套完整的微服务解决方案࿰…...
web-worker 基本使用
Web Workers 是浏览器中的一项技术,它允许在独立的线程中运行 JavaScript 代码,从而避免主线程阻塞。这对于执行长时间运行的计算、处理大量数据或执行其他 CPU 密集型任务非常有用。下面是一个简单的使用 Web Workers 的示例,包括主线程和工…...
SpringBoot使用@PropertySource读取 properties 配置
SpringBoot使用PropertySource读取 properties 配置 properties配置文件 在resources文件夹下,新建一个文件 property-demo.properties, 示例如下: my.config.test.namewumy.config.test.id123配置的类 PropertySource 指定配置文件。 c…...
100天精通风控建模(原理+Python实现)——第5天:风控建模中数据标准化是什么?
风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。 之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模? 100天精通风控建模(原理+Python实现)——第2天:风控建模有什么目的? 100天精通风控建模(原理+Python实现…...
find和grep命令的简单使用
find和grep命令的简单使用 一、find例子--不同条件查找 二、grep正则表达式的简单说明例子--简单文本查找例子--结合管道进行查找 一、find find 命令在指定的目录下查找对应的文件。 find [path] [expression]● path 是要查找的目录路径,可以是一个目录或文件名…...
力扣:164. 最大间距(Python3)
题目: 给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 来源:力扣(LeetC…...
游戏平台采集数据
首先,你需要在你的项目中添加Kotlin的网络库,例如OkHttp。你可以在你的build.gradle文件中添加以下依赖: dependencies {implementation com.squareup.okhttp3:okhttp:4.9.0 }然后,你可以使用以下代码来创建一个基本的网络爬虫&a…...
CSS让两个标签在同一行显示并自适应宽度
CSS让两个标签在同一行显示并自适应宽度 示例:svg 和 span 在同一行上并自适应宽度 使用 Flexbox 布局 HTML <div class"flex-container"><svg class"svg-icon" aria-hidden"true"><use :xlink:href"#icon-s…...
Leetcode154. Find Minimum in Rotated Sorted Array II
旋转数组找最小,这次值可以重复 不妨假设你已经做了上一题,题解 上一题的方法1肯定是用不了了,因为不再能完全分成2个不同的部分 所以我们沿着方法2走 如果 > n u m s [ r ] >nums[r] >nums[r],我们依然可以找右半边 …...
【分析思路】测试数据分析思路
测试数据分析思路: 性能数据 对性能测试数据进行分析时,可以从以下几个维度进行比较: 响应时间(Response Time):分析每一天的响应时间数据,可以查看系统在不同时间段的性能表现,是…...
链表的实现(文末附完整代码)
链表的概念及结构 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 我们在上一篇文章所学习的顺序表是连续存储的 例如: 顺序表就好比火车上的一排座位,是连续的 而链表就好比是火车…...
asp.net core 获取服务实例的几种方式
在ASP.NET Core中,我们可以使用以下几种方式来获取服务: 构造函数注入(Constructor Injection):在需要使用服务的类的构造函数中声明对应的服务类型参数,ASP.NET Core会自动将对应的服务实例注入进来。例如…...
指标体系:洞察变化的原因
一、指标概述 指标体系是指根据运营目标,整理出可以正确和准确反映业务运营特点的多个指标,并根据指标间的联系形成有机组合。 指标体系业务意义极强,所有指标体系都是为特定的业务经营目的而设计的。指标体系的设计应服从于这种目的&#x…...
Dell戴尔灵越Inspiron 7700 AIO一体机电脑原厂预装Windows10系统
链接:https://pan.baidu.com/s/1-slgR9t4Df_eko0Y6xaeyw?pwdmk0p 提取码:mk0p 灵越7700一体机原装出厂系统自带声卡驱动、无线网卡驱动、面部识别等所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 由于时间关系,…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
Linux入门课的思维导图
耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...



