【数据结构】什么是栈?

news2024/10/5 15:29:31

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022

目录

📌栈的定义

📌元素进栈出栈的顺序

📌栈的抽象数据类型

📌栈的顺序存储结构

📌栈的链式存储结构

链栈的进栈操作

链栈的出栈操作

📌栈的应用

🎏递归

🎏括号匹配问题

🎏四则运算表达式求值

结语


人生,需要有进栈出栈精神的体现.在哪里跌倒,就应该在哪里爬起来.无论陷入何等困境,只要抬头能仰望蓝天,就有希望,不断进取,你就可以让出头之日重现.困难不会永远存在,强者才能勇往直前.                                             ——封清扬

📌栈的定义

栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型.

栈(stack)是限定仅在表尾进行插入和删除操作的线性表.

我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈.栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构.

要理解栈这个概念,我们需要注意,首先栈是一个线性表,也就是说,栈具有线性关系,即前驱后继关系.只不过它是一种特殊的线性表而已.定义中说栈在线性表的尾部进行插入和删除操作,这里的表尾指的是栈顶,而不是栈底.

栈的插入操作,叫做进栈,也称压栈,入栈.类似于子弹入弹夹,如下图:

栈的删除操作,叫作出栈,也有的叫作弹栈.如同弹夹中的子弹出弹夹,如下图:

生活中类似于栈"先进后出"概念的东西很多,如我们平常用的抽纸,装羽毛球的球筒,装子弹的弹夹等.


📌元素进栈出栈的顺序

虽然栈的定义中规定了栈中元素必须符合先进后出的规则,但并没有对元素进出栈的时间做限制,因此最先进栈的元素,不一定就最后出栈,例如:

现在有三个整型元素1,2,3依次进栈,会有以下5种不同的出栈顺序:

第一种:1进,2进,3进.3出,2出,1出.

出栈顺序:321.

第二种:1进,1出,2进,2出,3进,3出.

出栈顺序:123

第三种:1进,2进,2出,1出,3进,3出.

出栈顺序:213

第四种:1进,1出,2进,3进,3出,2出.

出栈顺序:132

第五种:1进,2进,2出,3进,3出,1出,

出栈顺序:231


你可能会好奇,按照排列组合应该还有一个312的出栈顺序啊,为什么没写呢?别急,这是我们要重点分析的一种情况,我们把它拉出来单独分析:


首先,要出3的话,那么3肯定进栈了.按照1,2,3的进栈顺序,3进栈了,那么1,2肯定已经进栈了,所以3出栈时栈内的情况应该是这样的:

3出栈后,栈内元素情况是这样的:

可以看到,当前栈中栈顶元素为2,但我们想要出栈的元素是1,这是不可能做到的,因为按照栈的先进后出原则,我们此时只能先出2,再出1.

因此312的出栈顺序是不可能的.

根据上述对312出栈顺序的分析,我们可以得出一个结论:

即当按照由1~x的元素顺序入栈时,假设当前栈顶元素为x,则该栈不可能实现按照x,x-2,x-1顺序出栈.如下图:


📌栈的抽象数据类型

对于栈来讲,因为它的特殊性,因此在操作上相对于线性表有些变化,特别是插入和删除操作,只需要保留进栈出栈两部分.

栈的抽象数据类型如下:

ADT 栈(stack)
Data
	栈的数据对象集合为 {a1, a2, ..., an},每个元素的类型均为STDataType.
	其中, 除第一个元素a1外, 每一个元素有且只有一个直接前驱元素.
	除了最后一个元素an外, 每一个元素有且只有一个直接后继元素.
	数据元素之间的关系是一对一的关系.
Operation
	InitStack(*s);			初始化操作, 建立一个空的栈s.
    DestroyStack(*s)        若栈存在,则销毁它.
	StackEmpty(s);			若栈为空,返回true,否则返回false.
	ClearStack(*s);			将栈清空.
	GetTop(s, *e);		    若栈存在且非空,用e返回s的栈顶元素.
    Push(*s,e);             若栈s存在,插入新元素e到栈s中并成为栈顶元素.
	Pop(*s,*e);             删除栈s中栈顶元素,并用e返回其值.
	StackLength(s);			返回栈s的元素个数.
endADT

📌栈的顺序存储结构

顺序栈和顺序表一样,都是使用数组来实现的,对于这种只能一头插入和删除的线性表来说,使用下标为0的一端做为栈底比较好.因为顺序表尾插和尾删的时间复杂度都是O(1),而头插和头删因为要挪动元素,所以时间复杂度为O(n).对比来看,显然是用下标为0的一端做头,然后在数组尾部进栈出栈是较优的选择.

在顺序栈中需要包含三个要素:存储数据的数组arr,顺序栈的当前存储容量capacity,顺序栈栈顶元素的位置top.

随着数据的进栈和出栈,top位置在变化的,但无论如何top也不能够比数组容量capacity还要大.因此top必须小于capacity.当栈中存在一个元素时,top=0,因此同常把空栈的判定条件设为top=-1.

若现在有一个顺序栈,capacity是5,则栈普通情况,空栈满栈的情况示意图如下:

顺序栈中,进栈和出栈的逻辑完全和顺序表的尾插尾删逻辑一样,后续我们会一起实现一个顺序栈的程序,因此在这里就不多赘述了.


📌栈的链式存储结构

栈的链式存储结构,简称为链栈.

因为栈只在栈顶插入或删除的特性,我们在设计链栈时应当把栈顶放在单链表的头部,并且对链表来说,头指针是必须的,而对链栈来说,栈顶指针同样是必须的,因此我们不如将他们合二为一.

链栈示意图:

对于链栈来说,基本不存在栈满的情况.而对空栈来说,链栈的判断条件应该是top=NULL.

链栈的进栈操作

对于链栈的进栈push操作,假设元素新结点是e,top为栈顶指针,则进栈示意图如下:

链栈的出栈操作

对于链栈的出栈pop操作,假设top为栈顶指针,则出栈示意图如下:


📌栈的应用(待补)

🎏递归

🎏括号匹配问题

🎏四则运算表达式求值


结语

当我们了解了栈的定义后,接下来我们将一起实现一个顺序栈程序,由于篇幅有限,我会在下篇博客中为大家详细介绍一下顺序栈的实现,感兴趣的话可以点击下面链接查看:

【数据结构】用C语言实现顺序栈(附完整运行代码)icon-default.png?t=N7T8http://t.csdnimg.cn/ksbBH

希望这篇有关数据结构栈的介绍文章能对大家有所帮助,欢迎大佬们留言或私信与我交流.

 

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】什么是线性表?

【数据结构】线性表的链式存储结构

【数据结构】C语言实现顺序表万字详解(附完整运行代码)

【数据结构】C语言实现单链表万字详解(附完整运行代码)

【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)



数据结构栈和队列篇思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1250120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

micro_ros需要用到的hardware

我没有那么长的线啊,所以就用一个4块5的usb转串口看看 没有那么高档的开发板,就用主流的STM32F103C8T6试试看 这应该就是个仿真器了,一个字不认得都能够看的出来吧

《尚品甄选》:后台系统——权限管理之角色管理(debug一遍)

文章目录 一、权限管理介绍二、表结构的设计三、查询角色四、添加角色五、修改角色六、删除角色 一、权限管理介绍 在后台管理系统中,权限管理是指为了保证系统操作的安全性和可控性,对用户的操作权限进行限制和管理。简单的来说就是某一个用户可以使用…

【开源】基于JAVA的计算机机房作业管理系统

项目编号: S 017 ,文末获取源码。 \color{red}{项目编号:S017,文末获取源码。} 项目编号:S017,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课…

【开源】基于Vue和SpringBoot的食品生产管理系统

项目编号: S 044 ,文末获取源码。 \color{red}{项目编号:S044,文末获取源码。} 项目编号:S044,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3…

王道p150 14.假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树 b的宽度(即具有结点数最多的那一层的结点个数) (c语言代码实现)

采用层次遍历的方法求出所有结点的层次,并将所有结点和对应的层次放在一个队列中。然后通过扫描队列求出各层的结点总数,最大的层结点总数即为二叉树的宽度。 /* A B C D E F …

使用Pytorch从零开始构建Conditional PixelCNN

条件 PixelCNN PixelCNN 是 PixelRNN 的卷积版本,它将图像中的像素视为一个序列,并在看到前面的像素后预测每个像素(定义如上和左,尽管这是任意的)。PixelRNN 是图像联合先验分布的自回归模型: p ( x ) …

Leetcode 剑指 Offer II 054. 把二叉搜索树转换为累加树

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉搜索树,请将它的每个节点的值替换成树中…

visual studio 下的git

我这个是看视频笔记 YouTube : https://www.youtube.com/watch?vgkDASVE_Hdg 主要内容是:建立git 库, 保存commit, 建立分支 create branch, 合并分支merge branch,比较 diff,Revert ,history,delete branch, rename branch, t…

详解STUN与TR111

STUN协议定义了三类测试过程来检测NAT类型: Test1:STUN Client通过端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}发送一个Binding Request(没有设置任何属性)。STUN Server收到该请求后,通过端口{IP-S1:Port-S1}把…

网站定制开发主要分类有哪些|企业 app 软件小程序定制

网站定制开发主要分类有哪些|企业 app 软件小程序定制 网站定制开发是指根据客户需求,为其量身定制设计和开发的网站服务。目前,网站定制开发主要分为以下几个分类: 1.静态网站定制开发:静态网站是由 HTML、CSS 和 JavaScript 等静…

golang defer关键词执行原理与代码分析

使用的go版本为 go1.21.2 首先我们写一个简单的defer调度代码 package mainimport "fmt"func main() {defer func() {fmt.Println("xiaochuan")}() }通过go build -gcflags -S main.go获取到对应的汇编代码 可以在图中看到有个CALL runtime.deferreturn(…

深度解读英伟达新一轮对华特供芯片H20、L20、L2的定位

大家好,我是极智视界,欢迎关注我的公众号,获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 因为一直从事 AI 工…

统计二叉树中的伪回文路径 : 用位运用来加速??

题目描述 这是 LeetCode 上的 「1457. 二叉树中的伪回文路径」 ,难度为 「中等」。 Tag : 「DFS」、「位运算」 给你一棵二叉树,每个节点的值为 1 到 9 。 我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值…

python之pyqt专栏3-QT Designer

从前面两篇文章python之pyqt专栏1-环境搭建与python之pyqt专栏2-项目文件解析,我们对QT Designer有基础的认识。 QT Designer用来创建UI界面,保存的文件是"xxx.ui"文件,"xxx.ui"可以被pyuic转换为"xxx.py",而&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于Fisher时段划分的配电网源网荷储多时间尺度协调优化调控策略》

这个标题涉及到电力系统领域的一些关键概念和方法。让我们逐步解读: 基于Fisher时段划分: "基于"表示这个策略或方法的核心基础是某个特定的理论或技术。"Fisher时段划分"可能指的是使用Fisher信息矩阵进行时间划分。Fisher信息矩阵…

php的字符转义函数有那些,是干什么的

在 PHP 中,字符转义函数是用于处理字符串中的特殊字符,以防止这些字符被误解、滥用或引起安全问题的一组函数。这些函数的主要作用是确保在将用户提供的数据插入到数据库、构建 HTML 输出或进行其他与安全相关的操作时,不会导致潜在的安全漏洞…

基于Python 中创建 Sentinel-2 RGB 合成图像

一、前言 下面的python代码将带您了解如何从原始 Sentinel-2 图像创建 RGB 合成图像的过程。 免费注册后,可以从 Open Access Hub 下载原始图像。 请注意,激活您的帐户可能需要 24 小时! 二、准备工作 (1)导入必要的库…

内测分发平台如何保护用户隐私?

大家好,我是咕噜-凯撒,在软件开发的早期阶段,内测是一个至关重要的步骤。通过内测,开发者可以在产品正式上市前发现并修复bug,获取用户反馈优化用户体验。但是内测过程中往往会处理大量用户的敏感信息,尤其…

数字人直播系统开发要注意的陷阱

数字人做为元宇宙的底层基座,BAT都在跑步进场,目前具有前瞻性的公司都在布局数字人产业。数字人可以应用于很多业务场景,对今年来说,无疑数字人直播系统是最火的。像去年数字人直播SAAS系统定制开发的话没有个百把万是下不来的。但…

激光塑料透光率检测仪进行材料质量监控

焊接质量检测是对焊接成果的检测,目的是保证焊接结构的完整性、可靠性、安全性和使用性。焊接质量检测通常包括外观检验、内部检查、无损检测以及试件制作与送检等步骤。通过这些检测方法,可以全面评估焊接质量,确保其符合设计要求和规范标准…