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

栈和队列:栈

栈的概念:

栈:

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。

栈中的数据元素遵守后进先出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表示为栈顶后一个位置下标时写法: 



  

相关文章:

栈和队列:栈

栈的概念&#xff1a; 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。…...

由浅入深学习统计学 - 常用统计图形学习

学习笔记 第一章- 信息图形化 图形化&#xff08;可视化&#xff09; 在一堆数据中&#xff0c;自己发现了这些数据的规律&#xff0c;但是无法表述给其他人知道&#xff0c;图形化就是便于他人理解数据的规律的展示的手段。 或者说我们也可以从统计的数据图形中发现某些没有…...

【java进阶】集合的三种遍历(迭代器、增强for、Lambda)

目录 一、先谈集合&#xff1a; 二、单列集合的三种遍历方式 迭代器遍历 增强for遍历 Lambda表达式遍历 一、先谈集合&#xff1a; &#x1f525;那我们平常用for循环依赖下标遍历不行嘛&#xff0c;这就与集合的分类有关了。 集合的体系结构&#xff1a; collection是单…...

Qt实现动态桌面小精灵(含源码)

目录 一、设计思路 二、部分源码演示 三、源码地址 🌈write in front🌈 🧸大家好,我是三雷科技.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由三雷科技原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:三雷科技🧸—CSDN博客 🎁欢…...

Qt 自定义分页控件

目录 前言1、功能描述2、代码实现2.1 ui文件2.1 头文件2.2 源码文件2.3 设计思路 4、示例5、总结 前言 在应用程序开发时经常会遇到数据分页的需求&#xff0c;每一页展示特定数量的数据&#xff0c;通过点击按钮翻页或者输入页码跳转到指定页。 本文介绍一个自定义分页控件&a…...

Java中的7大设计原则

在面向对象的设计过程中&#xff0c;首先需要考虑的是如何同时提高一个软件系统的可维护性和可复用性。这时&#xff0c;遵从面向对象的设计原则&#xff0c;可以在进行设计方案时减少错误设计的产生&#xff0c;从不同的角度提升一个软件结构的设计水平。 1、单一职责 一个类…...

Spring Cloud和Kubernetes + Spring Boot 用哪个?

Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案&#xff0c;它们各有优势和不足&#xff0c;选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架&#xff0c;它提供了一套完整的微服务解决方案&#xff0…...

web-worker 基本使用

Web Workers 是浏览器中的一项技术&#xff0c;它允许在独立的线程中运行 JavaScript 代码&#xff0c;从而避免主线程阻塞。这对于执行长时间运行的计算、处理大量数据或执行其他 CPU 密集型任务非常有用。下面是一个简单的使用 Web Workers 的示例&#xff0c;包括主线程和工…...

SpringBoot使用@PropertySource读取 properties 配置

SpringBoot使用PropertySource读取 properties 配置 properties配置文件 在resources文件夹下&#xff0c;新建一个文件 property-demo.properties&#xff0c; 示例如下&#xff1a; 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 是要查找的目录路径&#xff0c;可以是一个目录或文件名…...

力扣:164. 最大间距(Python3)

题目&#xff1a; 给定一个无序的数组 nums&#xff0c;返回 数组在排序之后&#xff0c;相邻元素之间最大的差值 。如果数组元素个数小于 2&#xff0c;则返回 0 。 您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。 来源&#xff1a;力扣&#xff08;LeetC…...

游戏平台采集数据

首先&#xff0c;你需要在你的项目中添加Kotlin的网络库&#xff0c;例如OkHttp。你可以在你的build.gradle文件中添加以下依赖&#xff1a; dependencies {implementation com.squareup.okhttp3:okhttp:4.9.0 }然后&#xff0c;你可以使用以下代码来创建一个基本的网络爬虫&a…...

CSS让两个标签在同一行显示并自适应宽度

CSS让两个标签在同一行显示并自适应宽度 示例&#xff1a;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

旋转数组找最小&#xff0c;这次值可以重复 不妨假设你已经做了上一题&#xff0c;题解 上一题的方法1肯定是用不了了&#xff0c;因为不再能完全分成2个不同的部分 所以我们沿着方法2走 如果 > n u m s [ r ] >nums[r] >nums[r]&#xff0c;我们依然可以找右半边 …...

【分析思路】测试数据分析思路

测试数据分析思路&#xff1a; 性能数据 对性能测试数据进行分析时&#xff0c;可以从以下几个维度进行比较&#xff1a; 响应时间&#xff08;Response Time&#xff09;&#xff1a;分析每一天的响应时间数据&#xff0c;可以查看系统在不同时间段的性能表现&#xff0c;是…...

链表的实现(文末附完整代码)

链表的概念及结构 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 我们在上一篇文章所学习的顺序表是连续存储的 例如&#xff1a; 顺序表就好比火车上的一排座位&#xff0c;是连续的 而链表就好比是火车…...

asp.net core 获取服务实例的几种方式

在ASP.NET Core中&#xff0c;我们可以使用以下几种方式来获取服务&#xff1a; 构造函数注入&#xff08;Constructor Injection&#xff09;&#xff1a;在需要使用服务的类的构造函数中声明对应的服务类型参数&#xff0c;ASP.NET Core会自动将对应的服务实例注入进来。例如…...

指标体系:洞察变化的原因

一、指标概述 指标体系是指根据运营目标&#xff0c;整理出可以正确和准确反映业务运营特点的多个指标&#xff0c;并根据指标间的联系形成有机组合。 指标体系业务意义极强&#xff0c;所有指标体系都是为特定的业务经营目的而设计的。指标体系的设计应服从于这种目的&#x…...

Dell戴尔灵越Inspiron 7700 AIO一体机电脑原厂预装Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1-slgR9t4Df_eko0Y6xaeyw?pwdmk0p 提取码&#xff1a;mk0p 灵越7700一体机原装出厂系统自带声卡驱动、无线网卡驱动、面部识别等所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、MyDell等预装程序 由于时间关系,…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...