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

数据结构:(二)逻辑之门——栈与队列

一、 栈 (Stack):最后进,最先出

栈是仅限在栈顶(Top)进行插入或删除操作的线性表。其核心特性是LIFO (Last In First Out)

1. 顺序栈的指针含义

在 C 语言实现中,top指针的定义至关重要。

  • 习惯定义top指向栈顶元素的下一个位置

  • 空栈条件S.top == S.base

  • 满栈条件S.top - S.base >= S.stacksize

2. 核心算法:入栈与出栈

// 入栈 (Push) Status Push(SqStack &S, ElemType e) { if (S.top - S.base >= S.stacksize) return ERROR; // 满栈 *S.top++ = e; // 先把 e 放入 top 指向的位置,然后 top 指针自增 1 return OK; } // 出栈 (Pop) Status Pop(SqStack &S, ElemType &e) { if (S.top == S.base) return ERROR; // 空栈 e = *--S.top; // top 先减 1 指向栈顶元素,再取出赋值给 e return OK; }

二、 栈的顶级应用:括号匹配 (Parenthesis Matching)

这是一个典型的“后进先出”场景:最后出现的左括号,必须最先被匹配掉。

算法精髓:

  1. 遇到左括号:它是期待被匹配的,先“存”起来 ——压栈

  2. 遇到右括号:它来寻找匹配对象,找谁?找最近出现的那个左括号 ——弹出栈顶检查

  3. 匹配失败的三种情况

    • 遇到右括号但栈已空(右括号多余)。

    • 弹出的左括号与当前右括号不匹配(如[))。

    • 遍历结束但栈不为空(左括号多余)。


三、 队列 (Queue):先进先出,公平至上

队列是只允许在队尾 (Rear)插入、队头 (Front)删除的线性表。其特性是FIFO (First In First Out)

1. 循环队列 (Circular Queue):解决“假溢出”

在顺序存储下,随着出队入队,指针会一直向后移动直到超出界限。为了重复利用空间,我们将数组想象成一个“环”。

  • 核心公式:利用模运算%

  • 指针后移i = (i + 1) % MAXSIZE;

2. 难点:如何区分队空还是队满?

front == rear时,队列可能空也可能满。

严版教材方案:牺牲一个单元。

  • 队空Q.front == Q.rear

  • 队满(Q.rear + 1) % MAXSIZE == Q.front

  • 队列长度计算(高频考点):(Q.rear - Q.front + MAXSIZE) % MAXSIZE


四、 深度复盘:递归与栈的灵魂绑定

很多初学者不理解为什么递归需要栈。

详细注释

当一个函数(调用者)调用另一个函数(被调用者)时,系统必须保存调用者的“断点”信息(局部变量、返回地址等)。这些信息被压入系统栈。被调用者执行完后,从栈顶弹出信息恢复调用者。

递归就是一种特殊的嵌套调用,它不断地把每一层的信息压栈。如果递归没有出口,栈就会被撑爆,产生著名的Stack Overflow错误。


五、 今日对比小结

结构逻辑规则插入/删除位置典型应用
LIFO都在栈顶括号匹配、表达式求值、递归
队列FIFO队尾入、队头出打印机任务、缓冲区、BFS(广搜)

今日踩坑提醒:

  • 顺序栈Pop时,指针是先自减还是先取值?一定要看top的初始定义。

  • 循环队列的MAXSIZE并不是实际能存的元素个数,如果采取“牺牲一个单元”法,只能存MAXSIZE - 1个。


明日预告:第四章 串——深入浅出 KMP 算法,彻底搞定next数组推导!

http://www.jsqmd.com/news/313856/

相关文章:

  • 【MCU控制 初级手札】1.3 价电子、净电荷 【化学基础】 - 指南
  • EOM(Enterprise Operating Model企业经营模型)七大要素的界定(之一)--SMP(软件制作平台)语言基础知识之四十七
  • 【无功优化】电网故障下分布式能源系统多目标优化[并网转换器(GCC)]附Matlab代码Simulink
  • 【无迹卡尔曼滤波】不确定和间接测量的非线性动力系统识别研究附Matlab代码
  • 【无人机】【非线性模型预测控制(NMPC)】基于CasADi的无人机优化预测控制研究附Matlab代码
  • 一天一个开源项目(第5篇):Moltbot - 扒一扒爆火的AI桌面助手,是贾维斯平替还是过度炒作?
  • Android 15网络子系统深度解析(一):ConnectivityService与网络管理框架全解析
  • 227_尚硅谷_项目开发流程介绍
  • maven中的os-maven-plugin插件的使用
  • MyBatis 表多对一、一对多查询笔记
  • 设计PPT配色自动推荐工具,输入PPT主题,(商务/汇报/创意),推荐适配配色的方案,标注色值,支持一键复制,解决职场人配色纠结,让PPT更美观。
  • 制作面试问题准备工具,按岗位(运营/技术/行政)分类,整理高频面试题,生成个性化回答思路,支持模拟问答记录,帮求职者提升面试通过率。
  • 近期比较火的万商卡回收平台有哪些?
  • FastAPI系列(16):ORM创建模型类
  • 2026必备10个降AIGC工具,专科生速看!
  • 2026必备!8个一键生成论文工具,专科生轻松搞定毕业论文!
  • 【LeetCode刷题】LRU缓存
  • 神奇的环境变量
  • 基于Springboot+Vue的林业资源管理系统源码文档部署文档代码讲解等
  • 肝了整整90天!我把RK3588 Android开发做成了完整教程
  • 基于Springboot+Vue的旅游信息咨询网站的设计与实现源码文档部署文档代码讲解等
  • 基于Springboot+Vue的美食分享平台系统源码文档部署文档代码讲解等
  • 基于Springboot+Vue的民间救援队救助系统源码文档部署文档代码讲解等
  • 《P4035 [JSOI2008] 球形空间产生器》
  • “梦回汉唐”汉服商城网站的设计与实现(11823)
  • jspm“众优”大学生家教平台的设计与实现(11824)
  • 基于JSP的校园宿舍电费缴纳系统(11825)
  • “多鱼”旧物交易平台的设计与实现(11821)
  • “毛毛宠物店”宠物信息交流平台的设计与实现(11822)
  • Thinkphp和Laravel基于的农产品预售商城 平台设计_v8557农户_