栈和队列

栈和队列

栈的基本定义

栈是一种特殊的线性表,特点是先进后出

栈的操作只能在表的一端进行,出栈和入栈都只能在栈顶(表尾)进行

栈的两种实现:顺序栈和链栈

顺序栈

采用数组,用一个指针指向栈顶

双向顺序栈(空间利用率更高)
两个栈栈尾是数组的头元素和尾元素,用两个指针分别指向两个栈的栈顶元素的下一个元素

栈满的判定:左指针 > 右指针 (左指针 = 右指针时还有一个空间可以用)

参考代码文件:stack.h

链栈

基于链表实现的栈

注意指针是从栈顶指向栈底,所以插入删除操作都在链表的头部进行

栈的应用

表达式转换

一个操作数栈,一个运算符栈

中缀表达式

  1. 从左到右遍历,遇到操作数进栈就,遇到运算符就和当前栈顶运算符比较
  2. 若当前运算符低于栈顶运算符,就从操作数栈取出两个数计算栈顶运算符,将结果入栈,继续比较下一个栈顶运算符
  3. 若当前运算符优先级高于栈顶运算符,就进栈,继续遍历
  4. 若遍历结束运算符栈还不空,就依次取出运算符计算直到栈空为止

优先级:右括号 > x/ > +- > 左括号

前缀/后缀表达式:从左往右/从右往左遍历表达式,遇到操作数就进栈,遇到运算符就计算

数制转换

M 进制转 N 进制:不断除 N 取余数进栈,等到被除数为 0 后,将栈中元素取出就是结果


队列

队列的基本定义

队列是一种特殊的线性表,特点是先进先出

队列的插入只能在队头进行,插入只能在队尾进行

队列的两种实现:顺序队列和链队列

队列的实现

顺序队列

显然,如果按照常规的顺序队列,当队头和队尾同时移动会导致空间的浪费(在所有空间没有利用完时队尾就移到了数组尾部)

采用循环队列的形式,一个数组,一个队头下标和一个队尾下标

为了区分队空和队满,剩余一个空间不用

当队头 = 队尾时为空,队头 = 队尾 + 1 时队满

注意循环队操作时结果要对空间长度取模以防越界

参考代码文件:queue.h

链队列

采用链表的形式,但是只能在表头删除,表尾插入

链表需要加入尾指针

队列的应用

树的层次遍历

  1. 根节点入队
  2. 在队列不空时,取队头元素出队访问,然后将该节点的孩子节点入队
  3. 队列为空遍历结束

广度优先搜索 BFS

  1. 起始状态入队
  2. 队列不空时,取出队头状态访问,然后将该状态所有可达且未被访问过的状态入队
  3. 队列为空时遍历结束
posted @   DrinkLessMilkTea  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示