栈和队列
栈和队列
栈
栈的基本定义
栈是一种特殊的线性表,特点是先进后出
栈的操作只能在表的一端进行,出栈和入栈都只能在栈顶(表尾)进行
栈的两种实现:顺序栈和链栈
顺序栈
采用数组,用一个指针指向栈顶
双向顺序栈(空间利用率更高)
两个栈栈尾是数组的头元素和尾元素,用两个指针分别指向两个栈的栈顶元素的下一个元素
栈满的判定:左指针 > 右指针 (左指针 = 右指针时还有一个空间可以用)

参考代码文件:stack.h
链栈
基于链表实现的栈
注意指针是从栈顶指向栈底,所以插入删除操作都在链表的头部进行
栈的应用
表达式转换
一个操作数栈,一个运算符栈
中缀表达式
- 从左到右遍历,遇到操作数进栈就,遇到运算符就和当前栈顶运算符比较
- 若当前运算符低于栈顶运算符,就从操作数栈取出两个数计算栈顶运算符,将结果入栈,继续比较下一个栈顶运算符
- 若当前运算符优先级高于栈顶运算符,就进栈,继续遍历
- 若遍历结束运算符栈还不空,就依次取出运算符计算直到栈空为止
优先级:右括号 > x/ > +- > 左括号
前缀/后缀表达式:从左往右/从右往左遍历表达式,遇到操作数就进栈,遇到运算符就计算
数制转换
M 进制转 N 进制:不断除 N 取余数进栈,等到被除数为 0 后,将栈中元素取出就是结果
队列
队列的基本定义
队列是一种特殊的线性表,特点是先进先出
队列的插入只能在队头进行,插入只能在队尾进行
队列的两种实现:顺序队列和链队列
队列的实现
顺序队列
显然,如果按照常规的顺序队列,当队头和队尾同时移动会导致空间的浪费(在所有空间没有利用完时队尾就移到了数组尾部)
采用循环队列的形式,一个数组,一个队头下标和一个队尾下标
为了区分队空和队满,剩余一个空间不用
当队头 = 队尾时为空,队头 = 队尾 + 1 时队满
注意循环队操作时结果要对空间长度取模以防越界
参考代码文件:queue.h
链队列
采用链表的形式,但是只能在表头删除,表尾插入
链表需要加入尾指针
队列的应用
树的层次遍历
- 根节点入队
- 在队列不空时,取队头元素出队访问,然后将该节点的孩子节点入队
- 队列为空遍历结束
广度优先搜索 BFS
- 起始状态入队
- 队列不空时,取出队头状态访问,然后将该状态所有可达且未被访问过的状态入队
- 队列为空时遍历结束
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本