数据结构 (5)栈

devtools/2024/11/25 1:04:38/

一、基本概念

       栈是一种运算受限的线性表,它只允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),而另一端则被称为栈底(Bottom)。栈的插入操作被称为入栈(Push),删除操作被称为出栈(Pop)。栈具有后进先出(Last In First Out,LIFO)或先进后出(First In Last Out,FILO)的特性,即最后插入的元素会最先被删除。

二、抽象数据类型定义

       栈的抽象数据类型定义通常包括数据对象、数据关系以及基本操作。数据对象是栈中元素的集合,数据关系则定义了元素之间的顺序。栈的基本操作包括初始化、入栈、出栈、取栈顶元素以及判断栈是否为空等。

三、实现方式

  1. 数组实现:使用一组连续的内存空间来存储栈中的元素,并通过栈顶指针来指示栈顶元素的位置。入栈时,将新元素存储在栈顶指针的下一个位置,并更新栈顶指针;出栈时,将栈顶元素移动到栈顶指针的位置,并释放该空间,同时更新栈顶指针。数组实现的栈具有访问速度快、实现简单的优点,但存在空间利用率不高的问题,因为数组的大小在初始化时就已确定,当栈中元素数量超过数组大小时,需要进行扩容操作。
  2. 链表实现:使用一组节点来存储栈中的元素,每个节点包含一个数据域和一个指向下一个节点的指针。入栈时,将新元素添加到链表尾部,并更新栈顶指针;出栈时,将栈顶元素从链表中移除,并更新栈顶指针。链表实现的栈具有空间利用率高、可以动态增长或缩小的优点,但实现相对复杂一些。

四、基本操作及实现

  1. 初始化:创建一个空栈,并初始化栈顶指针和栈底指针。
  2. 入栈:将新元素添加到栈顶,并更新栈顶指针。
  3. 出栈:将栈顶元素移除,并更新栈顶指针。如果栈为空,则出栈操作失败。
  4. 取栈顶元素:返回栈顶元素的值,但不移除它。如果栈为空,则取栈顶元素操作失败。
  5. 判断栈是否为空:检查栈顶指针是否等于栈底指针,如果相等,则栈为空。

五、应用场景

  1. 函数调用:在函数调用过程中,系统会使用栈来保存函数的调用信息,如参数、局部变量和返回地址等。当函数执行完毕后,系统会从栈中弹出这些信息,以恢复调用函数的状态。
  2. 表达式求值:在表达式求值过程中,栈可以用来存储操作数和操作符。通过逆波兰表达式或中缀表达式求值算法,可以利用栈的后进先出特性来正确计算表达式的值。
  3. 深度优先搜索:在深度优先搜索算法中,栈可以用来存储待访问的节点。每次从栈顶取出一个节点进行访问,并将其相邻节点依次入栈。这样可以保证按照深度优先的顺序访问所有节点。
  4. 括号匹配:在检查字符串中的括号是否匹配时,可以使用栈来存储左边的括号。当遇到右边的括号时,从栈顶弹出一个元素进行匹配。如果栈为空或括号不匹配,则说明字符串中的括号不匹配。

 结语

不甘于平庸

还在为梦想奋斗

!!!


http://www.ppmy.cn/devtools/136696.html

相关文章

性能测试调优之线程池的性能优化

做性能测试时,有些压测场景下TPS上不去,或者响应时间变长,或者直接出现一些连接 被拒绝的报错,这些都有可能是tomcat的连接池不够引起的。 连接池的概念 线程池:是一个管理线程集合的框架,它负责维护一个…

返回流类型接口的错误信息处理

返回流类型接口的错误信息处理 前言axios拦截器src/utils/request.ts对应接口 前言 返回流类型接口需要在响应成功回调里拦截,且该接口的status始终是200,尽管后端返回的code可能是非2xx,因此返回流类型的接口,其错误信息需要单独…

游戏AI实现-决策树

代码实现: 定义一个决策树节点 class DecisionTreeNode{public DecisionTreeNode(){} } 定义一个行为类: class Action : DecisionTreeNode{ } 定义一个决策类: class Decision : DecisionTreeNode{ } 应用: 参考书…

goframe开发一个企业网站 MongoDB 完整工具包19

1. MongoDB 工具包完整实现 (mongodb.go) package mongodbimport ("context""fmt""time""github.com/gogf/gf/v2/frame/g""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )va…

量子卷积神经网络

量子神经网络由量子卷积层、量子池化层和量子全连接层组成 量子卷积层和量子池化层交替放置,分别实现特征提取和特征降维,之后通过量子全连接层进行特征综合 量子卷积层、量子池化层和量子全连接层分别由量子卷积单元、量子池化单元和量子全连接单元组…

C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合

在C#编程中,二维数组(或矩阵)是一种重要的数据结构,它不仅能够高效地存储和组织数据,还能通过其行、列和交叉点(备注:此处相交处通常称为“元素”或“单元格”,代表二维数组中的一个…

网络安全(骇客)—技术学习

**读者福利 |*** 🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0…

一线大厂面试集锦

String 为什么要设计成不可变的 String被设计成不可变的有以下几个原因: 线程安全:由于String是不可变的,多个线程可以同时访问同一个String对象而无需担心数据被修改。这使得String在多线程环境下是线程安全1. 的。 2.缓存Hash值:由于String是不可变的,它的hashcode可以…