【数据结构】栈的基本知识详解

栈的基本概念与基本操作

  • 导言
  • 一、栈的基本概念
    • 1.1 栈的定义
    • 1.2 栈的重要术语
    • 1.3 栈的数学性质
  • 二、栈的基本操作
  • 结语

封面

导言

大家好,很高兴又和大家见面了!!!
今天开始,咱们将正式进入【数据结构】第三章的内容介绍。在第三章的内容中,我们需要掌握栈和队列的操作及其特征,以及数组与特殊矩阵的压缩存储等知识点。为了更好的掌握这些知识点,我们将对这些知识点进行一一介绍。
今天要介绍的是咱们的第一位新朋友——栈。我们在今天的篇章中需要搞清楚以下几个问题:

  1. 什么是栈?
  2. 栈有哪些重要术语?
  3. 栈的操作特性是什么?
  4. 栈有哪些基本操作?

下面我们就开始今天的内容吧!

一、栈的基本概念

1.1 栈的定义

栈(Stack)是只允许在一端进行插入或者删除操作的线性表

在前面的学习中,我们知道了线性表就是具有相同数据类型的n(n>=0)个数据元素的有限序列。从栈的定义中我们可以看到,栈也是一个线性表,也就是说存放在栈中的数据元素是有限的,且数据元素的数据类型相同。我们需要注意的是栈的定义中强调了一个点——只允许在一端进行插入或者删除操作

为什么要强调只允许在一端进行插入或者删除呢?下面我们来回忆一下线性表。

  • 在顺序表中,我们在进行插入或删除操作时可以通过元素的位序进行随机存取,从而完成插入或者删除的操作;
  • 在链表中,我们同样可以通过元素对应的位序来完成插入或者删除操作;
  • 也就是说不管是顺序表还是链表,在进行插入或者删除操作时我们只需要得到数据元素对应的位序就能实现,因此,这两种线性表都是可以在表中的任意位置进行插入或者删除操作的。

在结合这里的只允许在一端,我们就能得到结论,对于栈这种线性表它在进行插入或者删除操作时是有局限性的

1.2 栈的重要术语

栈顶(Top)——线性表允许进行插入删除的一端
栈底(Bottom)——线性表不允许进行插入删除的一端
空栈——不含任何元素的空表
接下来我们根据图像来更进一步理解这些术语:
栈的重要术语

  • 我们可以把栈想象成一个水杯,我们在倒水时只能从杯口往杯里加水,喝水时只能从杯口将杯中的水倒出来;杯子的杯底是固定的,我们不能通过从杯底进行加水和倒水;当杯子中没有任何东西时,这个杯子为空杯。
  • 因此,水杯的杯口就是栈的栈顶水杯的杯底就是栈的栈底;水杯中没有任何东西时,对应的就是栈中没有任何数据元素,此时的空杯对应的栈为空栈

下面我们假设某个栈S中有 a 1 , a 2 , a 3 , a 4 , a 5 a_1,a_2,a_3,a_4,a_5 a1,a2,a3,a4,a5这五个元素,如下图所示:
栈的重要术语2
由于只能从栈顶进行插入和删除操作,因此我们在将这个五个元素依次放入栈中时,它们放入的顺序应该是:
a 1 − > a 2 − > a 3 − > a 4 − > a 5 a_1->a_2->a_3->a_4->a_5 a1>a2>a3>a4>a5,而它们的存放从上到下依次是: a 5 − > a 4 − > a 3 − > a 2 − > a 1 a_5->a_4->a_3->a_2->a_1 a5>a4>a3>a2>a1。在这个栈中 a 1 a_1 a1是离栈底最近的元素,因此它也被称为栈底元素,而 a 5 a_5 a5是离栈顶最近的元素,因此它也被称为栈顶元素。如果我们需要删除这些元素时,我们也应该按照它们的存放顺序进行删除也就是: a 5 − > a 4 − > a 3 − > a 2 − > a 1 a_5->a_4->a_3->a_2->a_1 a5>a4>a3>a2>a1

由此可见,对于栈这种线性表而言他的操作特性可以概括为——后进先出(Last In First Out,LIFO)

Tips:

  1. 我们在介绍【函数栈帧的创建与销毁】时,就有提到过函数的栈帧空间。在创建一个新的函数栈帧时,就有进行压栈和出栈等操作,进行压栈和出栈时就是从栈顶实现的。
  2. 我们在存放数据时,会根据数据存放的空间的起始地址来标记该元素的所在位置,如果将对应的空间想象成栈的话,那指向该空间的指针,指向的就是这个空间的栈顶。

1.3 栈的数学性质

由于栈的操作性质,那我们在对其进行入栈和出栈操作时就可能会出现以下的几种情况:

  • 按元素顺序进行入栈,全部入栈后再依次出栈;
  • 按元素顺序进行入栈,入栈的过程中穿插出栈;

对于第一种情况我们可以很好的理解它的元素出栈顺序——与入栈顺序相反;
但是在第二种情况下,如果有n个元素进行入栈与出栈操作,出栈元素不同的排列个数为 1 / ( n + 1 ) C 2 n n 1/(n+1)C^{n}_{2n} 1/(n+1)C2nn。这个公式被称为卡特兰数(Catalan),这个公式也是栈的数学性质。

二、栈的基本操作

在介绍线性表时,我们有介绍过线性表的基本操作概括一下就是——创建、销毁、增删改查。当然我们在修改元素前也是需要先查找到对应元素才行。对于栈这种线性表而言,我们可以对其进行的基本操作同样可以总结为以下几点:

1.创建销毁

  • InitStack(&S):初始化一个空栈S;
  • DestroyStack(&S):销毁栈,并释放栈S占用的存储空间;

对于栈的创建与销毁操作,它和线性表一样都是对整个对象进行修改,所以这里需要使用引用符号,通过C语言实现的话就是需要借助指针,如下所示:

//初始化
bool InitStack(StackType* S);
//销毁
bool DestroyStack(StackType* S);
//StackType——栈的数据类型
//StackType*——指针数据类型
void test() {StackType S;//定义数据类型为StackType类型的栈SInitStack(&S);//对栈进行初始化DestroyStack(&S);//销毁栈
}

对于栈的数据类型今天我们就不再展开,在下一篇栈的基本操作的C语言实现中,我们会再详细介绍;


  1. 增加删除
  • Push(&S,x):进栈,若栈S未满,则将x加入使之称为新的栈顶;
  • Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回;

对于栈的增加与删除操作,可以看到都是对栈顶元素进行的,但是有一点不同的是,我们在进行增加即进栈操作时,并未对数据x进行引用操作,但是在出栈时需要对x进行引用。
这是因为我们在进栈时是对明确的元素进行进栈操作,这时我们需要修改的只有栈空间,但是在出栈操作时,我可能并不知道此时的栈顶元素存储的是什么内容,我只需要删除栈顶元素,所以我需要将删除的元素给带回到主函数中来告诉大家我们现在删除的是什么元素,因此需要对x进行引用,通过C语言来实现的话则是:

//进栈
bool Push(StackType* S, ElemType x);
//出栈
bool Pop(StackType* S, ElemType* x);
//StackType——栈的数据类型
//StackType*——指针数据类型
//ElemType——数据元素的数据类型
//ElemType*——指针数据类型
void test() {StackType S;//定义数据类型为StackType类型的栈SElemType x = 0;Push(&S, x);//进栈Pop(&S, &x);//出栈
}

与线性表一样,在具体的实现中我们对于进栈和出栈的函数返回类型可以根据要求进行变化,不一定是布尔类型;


  1. 查找
  • GetTop(S,&x):读栈顶元素,若栈S非空,则用x返回栈顶元素;

在对栈进行查找操作时,我们查找的是栈顶元素,并且需要将查找到的栈顶元素进行带回,因此这里需要对x进行引用,通过C语言实现的话则是:

//查找
bool GetTop(StackType S, ElemType* x);
//StackType——栈的数据类型
//ElemType——数据元素的数据类型
//ElemType*——指针数据类型
void test() {StackType S;//定义数据类型为StackType类型的栈SElemType x = 0;GetTop(S, &x);//查找栈顶元素
}

具体的返回类型我们也可以根据需求进行修改,因为这里是通过传址的方式进行传参,所以只要在函数中对x存储的数值有进行修改,那回到主函数后实参也会跟着被修改;


4.其它

  • StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false

对于判空操作而言,就是简单的判断一下栈中有没有元素,因此并未对栈的内容有任何更改,所以这里我们不需要使用引用操作,用C语言表示则是:

//判空
bool StackEmpty(StackType S);
//StackType——栈的数据类型
void test() {StackType S;//定义数据类型为StackType类型的栈SStackEmpty(S);//判空
}

在不需要对实参进行修改的函数调用中,我们只需要通过传值传参即可。


以上就是栈的基本操作的C语言格式,对于具体的参数类型、函数的返回类型以及函数的具体实现,我们会在后面的篇章中详细介绍,大家记得关注哦!

结语

今天的内容比较简单在今天的内容中,我们主要介绍了在导言部分提出的几个问题:

  1. 什么是栈?
    栈(Stack)是只允许在一端进行插入或者删除操作的线性表

  1. 栈有哪些重要术语?
    栈顶、栈底、空栈、栈顶元素、栈底元素

  1. 栈的操作特性是什么?
    后进先出——Last In First Out,LIFO

  1. 栈有哪些基本操作?
    创建销毁、增加删除、查找、判空

咱们还简单介绍了一下栈的数学性质——卡特兰数(Catalan),在后面的篇章中我会进行详细的介绍,大家记得关注哦!

今天的内容到这里就结束了,希望这篇内容能帮助大家更好的理解栈的基础知识点,在接下来的内容中咱们将继续介绍如何通过C语言实现栈的基本操作。最后感谢大家翻阅,咱们下一篇再见!!!

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

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

相关文章

vue3用户权限管理(路由控制等)1

在前端开发的过程中,我们需要做前端的权限管理,我们需要根据后端提供的信息来控制权限,这时候就需要根据用户的操作来进行权限控制了。逻辑稍微有一点绕,多理解就好了。 用户路由权限管理 大致的实现原理: 一般将路由…

解析IT运维领域ITSS和ITIL证书

🌻IT运维领域ITSS和ITIL证书是两种广泛认可的专业认证。 📗ITSS认证证书 ITSS是中国电子技术标准化研究院推出的,👉包含“IT 服务工程师”和“IT 服务经理”的系列培训。有效满足GB/T 28827.1 的符合性评估要求和ITSS服务资质升级…

中国建设银行 关于解决微软升级导致插入网银盾无法自动打开企业网银的通知

关于解决微软升级导致插入网银盾无法自动打开企业网银的通知 发布时间:2023-10-18 尊敬的客户: 近期Windows操作系统升级会禁止使用IE浏览器,可能会导致您在插入网银盾后无法自动弹出企业网银登录页面,您可以通过以下方式解决&…

QUV紫外光老化加速试验机

1.1 IEC61215标准背景 IEC61215Crystallinesiliconterrestrialphotovoltaic(PV)modules—Designqualificationandtypeapproval》是国际电工委员会的一个产品测试方法。目前太阳能行业正在广泛引用这个标准,对材料或产品进行测试。 2 材料耐候性老化测试原理 在介…

杨中科 ASP.NET Core 中的依赖注入的使用

ASP.NET CORE中服务注入的地方 1、在ASP.NET Core项目中一般不需要自己创建ServiceCollection、IServiceProvider。在Program.cs的builder.Build()之前向builderServices中注入 2、在Controller中可以通过构造方法注入服 务。 3、演示 新建一个calculator类 注入 新建TestC…

网页内容任君采撷-右键无法复制

CSDN一年一度的博客之星评选活动已经结束,刚好点击来看看学习一下大佬们的博客。 发现绝大部分的博主对于知识的公开度都是非常高的,当然除了收费的专栏外。 其中少部分博主对自己的博文设定了一定的操作,无法直接使用博文中的内容。 现在大…

Photoshop Express一款出色的照片编辑器

​【应用名称】:Photoshop Express ​【适用平台】:#Android ​【软件标签】:#Photoshop ​【应用版本】:12.1.2 ​【应用大小】:223MB ​【软件说明】:软件升级更新。一款出色的照片编辑器&#xff0c…

生成模型 | 2024年新年新论文:audio2photoreal[正在更新中]

本博客主要包含了20240103新出的论文From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations论文解释及项目实现~ 论文题目:20240103_From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations 论文地址:2401.018…

8年测试总结,正确的自动化测试实施-单元/接口/Web自动化...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 今天给大家分享自…

作业--day42

界面设计 MyProWin::MyProWin(QWidget *parent): QMainWindow(parent) {/**********窗口主体**********///窗口大小this->setFixedSize(644, 493);this->setWindowTitle("QQ");this->setWindowIcon(QIcon("C:/Users/10988/Downloads/pictrue/pictrue/…

java中实现对文件高效的复制

不多说我们直接上代码: 这个是使用NIO包下的FileChannel和ByteBuffer进行文件的操作的,会比较高效。

JavaScript(WebAPI)

文章目录 1. 什么是 WebAPI2. DOM 基本概念2.1 DOM 树 3. 获取元素3.1 querySelector3.2 querySelectorAll 4. 事件初识4.1 键盘事件 5. 操作元素5.1 获取/修改元素属性5.2 获取/修改表单元素属性5.3 获取/修改样式属性 6. 操作节点6.1 新增节点6.2 删除节点 1. 什么是 WebAPI …

浅谈智慧路灯安全智能供电方案设计——安科瑞赵嘉敏

摘要: 智慧路灯,作为智慧城市、新基建、城市更新的主要组成部分,近些年在各大城市已得到很好的落地和 应用,但其与传统路灯相比集成大量异元异构电子设备,这些设备的供电电压、接口形式、权属单位各不相同, 如何设计一…

Z-library居然来中国了!

提起「Z-Library」的大名,想必有不少朋友是知道的,早在2021年11月该网站遭遇了封站,好在目前已经有了比较稳定的国内直达网址,实测过了几个月还是能够稳定访问。 Z-Library是一个电子图书馆项目,提供世界上最大的免费…

java编程中,保证接口幂等性的实现方案讨论

一、什么是幂等性 数学中的幂等是指f(x) f(f(x)),编程领域的术语是指同一个操作,在重复提交的情况下,最终产生的影响是不变的。举例说: 提交订单时,用户在购物车界面,重复点击“下单”,服务端…

【CUDA】windows下的CUDA安装

一、前言 windows10 下安装 CUDA ,首先需要下载安装包: CUDA toolkit(工具包) 二、安装前的准备 电脑环境检查 通过cmd,输入nvidia-smi 查看自己的驱动版本和支持的CUDA版本,如下图红圈标记位置 下载 …

尤雨溪:框架挖坑靠文档来补,这算 PUA 用户吗?丨 RTE 开发者日报 Vol.122

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

使用开源通义千问模型(Qwen)搭建自己的大模型服务

目标 1、使用开源的大模型服务搭建属于自己的模型服务; 2、调优自己的大模型; 选型 采用通义千问模型,https://github.com/QwenLM/Qwen 步骤 1、下载模型文件 开源模型库:https://www.modelscope.cn/models mkdir -p /data/…

Jmeter 性能 —— 吞吐量与并发用户数关系!

1、吞吐量和并发用户数的关系 2、已知在线用户数为3000,算出对应的并发用户数 ①我们常用的确定并发用户数的公式是: C活动用户数操作时间/系统运行时间 如每天最大在线用户数为3000人,每个用户平均操作时间为1小时,系统运行时…

【后退N帧协议】- 协议应用与局限分析

后退N帧协议是计算机网络通信中常用的一种流量控制协议,用于确保数据的可靠传输。本文将深入探讨后退N帧协议的原理、应用场景及局限性。 后退N帧协议的核心思想是在发送端发送数据时,等待接收端返回的确认信号。发送端每次发送N帧数据,并等…