【数据结构】栈及其经典面试题详解

news2025/1/20 10:53:53

目录

    • 前言
    • 一、栈的介绍
    • 二、数据类型重定义
    • 三、栈的结构
    • 四、栈中的常见操作
    • 五、测试栈
    • 六、栈的常见面试题

前言

前面学习的线性表中包含顺序表和链表,这两种数据结构允许在任意位置进行插入和删除,那么有没有一种数据结构是不能在任意位置进行插入删除,而只允许在一边进行插入删除的呢??当然有的,这就是我们今天要学习的一种新的数据结构:栈

一、栈的介绍

栈是一种只允许在一端进行插入删除的数据结构,插入删除的一端叫做栈顶,不能进行插入删除的一端叫做栈底。

  • 入栈:指在栈进行插入数据的操作。
  • 出栈:指删除栈中的栈底元素的操作。
    由于栈的特殊性质,所以栈的元素的出入会满足后进先出的原则。

二、数据类型重定义

通常情况下,为了能够方便的修改数据结构中存放的数据类型,我们会对数据类型进行重定义
在这里插入图片描述

三、栈的结构

在学习任何的数据结构的时候,最重要的首先是要了解这个数据结构的结构,既然栈是一种数据结构,那么就说明栈可以用来存储数据,所以栈的结构中一定包含一个数据域,由于栈需要不断对栈顶元素进行出栈,所以需要一个标记栈顶元素的指针,综合这两种,我们觉得数据域设置成数组能够方便的处理这个问题。由于是数组,如果是静态数组,就导致数组的容量不能变,容量太小,会导致不够,容量太大,导致空间浪费。因此,我们觉得动态数组能够方便处理以上问题。动态数组就涉及到扩容的问题,所以肯定需要一个变量来记录数组中的容量。
在这里插入图片描述
在上述的结构中,val表示栈的数据域,是一个动态的数组,top表示栈顶指针,能够标识栈顶元素的情况,capacity表示栈中的容量大小。
这里需要注意一个点:top能够表示栈顶元素的情况,是数组的下标,其初始状态可以是两种表示方法

  • 第一种:top = 0,表示的是栈顶元素的下一个位置,即入栈时新元素插入的位置
  • 第二种:top = -1,表示的是栈顶元素的位置,当栈为空的时候,显然没有栈顶元素,所以此时top = -1。
    通常情况下,为了方便表示,我们会对定义的数据结构进行重定义
    在这里插入图片描述

四、栈中的常见操作

学习数据结构的另一个核心就是学习如何对这些数据结构进行操作

  1. 常见函数接口的声明
    在这里插入图片描述
    在上面的声明中,我们发现函数参数中传的是栈的结构体地址,这是为啥呢?
    我们知道栈的结构本质是一个结构体,所以结构体一般都是很大的,同时,我们在函数体中有时可能需要对栈中的内容进行修改,比如入栈和出栈,就需要改变栈中的内容,如果传的是栈的结构体,那么在函数的形参中我们知道是一份实参的拷贝,所以对形参的改变是不会影响实参的,那么我们考虑传结构体的地址,通过结构体的地址,函数就可以通过指针找到真正想改变的内容。
    因此,传结构体的地址的好处有两个:
  • 节省形参的空间
  • 能够找到真正向改变的实参,从而改变实参的内容
  1. 常见函数接口的实现
  • 栈的初始化
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/eaf41fe1eec14806a680bc01cba32f72.pn

初始化函数是根据数据结构中的结构来实现的,我们知道栈中包含一个动态数组的指针和一个栈顶指针和一个容量,动态刚开始啥数据都没有,我们只需要对其置成空指针即可,栈顶指针指向的是栈顶元素在数组中的下标的下一个位置,即新元素入栈时所在的位置,当栈为空的时候,栈顶指针指向0,刚开始的容量就是0

  • 销毁栈
    在这里插入图片描述

销毁栈函数主要是完成对栈中申请的空间进行释放

  • 入栈
    在这里插入图片描述
    入栈时一定要考虑栈是否已经满了,如果已经满了,则需要进行扩容,扩容时一定要注意原先栈中的容量是否为0(初始化状态),这种情况需要进行特殊处理。因为top表示的是栈顶元素的下一个位置,所以是先将元素入栈到top位置,再将top++。

  • 出栈
    在这里插入图片描述
    出栈的本质就是删除栈顶元素,在出栈的时候一定要注意栈是否为空,当st->top>0时才可以进行删除数据,删除的时候并不是真的将该数据从内存中移除,而是将栈顶指针往前移一位即可。

  • 返回栈顶元素
    在这里插入图片描述
    返回栈顶元素函数中,也要注意栈是否为空,如果栈为空,无法返回栈顶元素,这里需要注意,因为top表示的是栈顶元素的下一个位置,所以返回的是top的前一个位置的值,而不是返回top位置的值。

  • 判空
    在这里插入图片描述
    当栈顶指针指向0的时候表示现在栈是空的状态,即初始化状态。

  • 栈的大小
    在这里插入图片描述
    当栈为空的时候,top = 0,每次入栈的时候,top++,出栈的时候top–,所以top可以很好地表示栈的数据个数

  • 栈的容量
    在这里插入图片描述


在上面的函数定义中,我们发现每一个函数都需要对栈的结构体指针进行断言操作,这是为啥?
在函数的操作中,我们知道函数中需要通过栈的结构体指针找到栈中的内容,也就是需要对栈的结构体指针进行解引用,因此,这个结构体指针是一定不能为空的,否则就会出现空指针的解引用从而使程序崩溃。

五、测试栈

在这里插入图片描述
从上面的测试代码中,我们要学习栈的基本使用:先定义一个栈的结构体,再对这个栈进行初始化操作,后面再进行各种常见的操作。除此之外,我们还需要学习栈的遍历思路:需要一个循环来解决,当栈不为空时,先访问栈的栈顶元素,再出栈。
2.
在这里插入图片描述

六、栈的常见面试题

  1. 括号匹配:有效的括号
    题目:
    在这里插入图片描述

提交代码:
在这里插入图片描述

提交结果:
在这里插入图片描述

思路分析:
本题中采用构造一个栈来解决问题,遍历给定的字符串,当遇到左括号时,入栈,当遇到右括号时,出栈顶元素和此时的右括号进行匹配,如果匹配,继续向后遍历字符串,如果不匹配,则此时返回false,在遇到右括号时,此时还需要注意一个问题,如果此时栈中没有元素,也就是没有左括号与之匹配,则返回false。当遍历完字符串之后,需要检查此时栈是否为空,如果栈为空,则成功匹配,返回true,如果栈不为空,则匹配失败,返回false。

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

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

相关文章

全面解读MinION纳米孔测序技术及应用

全面解读MinION纳米孔测序技术及应用 link:https://www.seqchina.cn/467.html 【测序中国】 paper:The Oxford Nanopore MinION: delivery of nanopore sequencing to the genomics community https://pubmed.ncbi.nlm.nih.gov/27887629/ 纳米孔测序技术…

知识蒸馏 Knowledge distillation(学习笔记)

知识蒸馏概述 蒸馏:把大的 复杂的东西变成小的纯净的东西 在知识蒸馏中 大的模型为 教师模型(teacher)臃肿 集成 牛逼 复杂的 小的 为 学生模型(student)小的精干的 轻量化的 这里有一个知识的迁移 因为落地实…

相关性模型与回归模型(例题代码)

一、相关性模型(SPSS) 相关性模型涉及到两种最为常用的相关系数: 皮尔逊person相关系数斯皮尔曼spearman等级相关系数 1、皮尔逊相关系数 相关性可视化 总结: 1.如果两个变量本身就是线性的关系,那么皮尔逊相关系…

儿子小伟再婚,新儿媳紧锁眉头,农民歌唱家大衣哥有些过分了

虽然都知道大衣哥儿子小伟结婚,这一天早晚都要到来,但是却没有想到来得那么快,大衣哥儿子小伟的婚礼,在悄无声息中结束了。说起大衣哥儿子小伟,这已经不是第一次结婚了,因为结过婚有经验,这一次…

Linux CFS调度器之pick_next_task函数

文章目录前言一、pick_next_task二、pick_next_task_fair参考资料前言 在内核执行__schedule函数,进程任务切换的时候,__schedule函数函数会调用pick_next_task让调度器从就绪队列中选择最合适的一个进程运行,如下所示: static …

Nerdctl 原生支持 Nydus 加速镜像

文|李楠(GitHub ID : loheagn) 北京航空航天大学 21 级研究生 云原生底层系统的开发和探索工作。 本文 6369 字 阅读 16 分钟 OSPP 开源之夏是由中科院软件研究所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动。旨在鼓励在…

关于whl,你想知道的

一、whl是什么?whl文件时以wheel格式保存的python安装包,Wheel是Python发行版的标准内置包格式。WHL文件包含Python安装的所有文件和元数据,其中还包括所使用的Wheel版本和打包的规范。WHL文件使用Zip压缩进行压缩,实际上也是一种…

二、TCO/IP---Ethernet和IP协议

TCP/ip协议栈 OSI模型TCP/IP协议栈应用层,表示层,会话层应用层传输层主机到主机层(传输层)网络层网络层数据链路层,物理层网络接入层 Ethernet协议 以太网,实现链路层的数据传输和地址封装(MA…

【Qt】Qt中的拖放操作实现——拖放文件以及自定义拖放操作

文章目录Qt的拖放操作使用拖放打开文件自定义拖放操作文章参考《Qt Creator快速入门(第三版)》。 Qt的拖放操作 拖放操作分为拖动Drag和放下Drop,Qt提供了强大的拖放机制,可在帮助文档中通过Drag and Drop关键字查看。 在Qt中&a…

ArcGIS基础实验操作100例--实验78按栅格分区统计路网

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验78 按栅格分区统计路网 目录 一、实验背景 二、实验数据 三、实验步骤 (…

【数据结构】队列详解

前言 前面我们学习了一种数据结构:栈,栈是一种只允许在一端尽进行插入删除的数据结构,而今天我们将学习另一种数据结构:队列,队列是一种支持在一端进行插入,在另一端进行删除的数据结构。 一、队列的介绍…

PHP反序列化字符串逃逸

PHP反序列化字符串逃逸 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录PHP反序列化字符串逃逸前言一、关于反序列化和序列化二、[0ctf 2016]unserialize二、prize_p5[NSSCTF]前言 例如:最近日常刷题玩…

常用的传输码介绍

文章目录前导知识1.AMI码2.HDB3码3.PST码4.数字双相码5.CMI码6.nBmB码前导知识 在介绍常用的传输码之前,先简单介绍一下直流分量。 信号的直流分量就是信号的平均值,它是一个与时间无关的常数,直流分量的数学公式表示为: 判断有…

基于轻量级YOLOv5+Transformer的汽车车损检测识别分析系统

将传统NLP领域提出来的Transformer技术与yolo目标检测模型融合已经成为一种经典的做法,早在之前的很多论文里面就有这种组合应用的出现了,本文主要是借鉴前文的思路,开发基于yolov5transformer的汽车车损检测识别模型,首先看下效果…

光流相关总结

基于图像亮度恒定假设, 图像亮度:I(x⃗,t)I(\vec x, t)I(x,t), 其中x⃗[x,y]\vec x[x,y]x[x,y],那么亮度恒定假设: I(x⃗,t)I(x⃗δx⃗,tδt)(1)I(\vec x,t)I(\vec x \delta \vec x, t \delta t) (1)I(x,t)I(xδx,tδt)(1) 对上式…

2022年值得记录的一年,事与愿违的一年

年初带着对生活的不满、怀才不遇的傲慢; 愿即将到来的30岁不留遗憾; 你放下所有去追求向往的样子; 那时所有的空气都是清新的,即使它满是灰尘; 不再年少的你依然充满新奇; 用尽力气把自己钉在那个不属…

前端与后端的技术通性

一、后端的JDK相当于前端的Node.js, 后端的JVM相当于前端的V8引擎【作用示例图,如下所示】 【Nodejs、JDK分别是前后端的运行环境】 二、后端的Maven(基于项目对象模型-Project Object Model-POM的项目管理机制)相当于前端的npm(n…

FlinkCDC

目录1、CDC 简介1.1、什么是CDC1.2、CDC的种类1.3、Flink-CDC2、Flink CDC 网址3、运行原理5、简要安装6、开发案例7、扩展1、CDC 简介 1.1、什么是CDC CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动…

js实现网页特效

文章目录一、元素偏移量offest系列🥇offset与style的区别🎓案例1🦹🏽‍♂️案例2🐼案例3二、元素可视区client系列三、元素滚动scroll系列🏂🏿案例4:🔭补充 mouseenter事…

大数据分析案例-基于KNN算法对茅台股票进行预测

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…