数据结构-栈和队列

109 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情

栈和队列

栈是只允许在一端进行插入或删除操作的线性表

image-20220818220044775

栈的基本操作

InitStack(&S):初始化栈。构建一个空栈S,分配内存空间

DestroyStack(&L):销毁栈。销毁并释放栈S所占用的内存空间

Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶

Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回

GetTop(S,&x):读栈顶元素,若栈S非空,则用x返回栈顶元素

其他常用操作:

StackEmpty(S):判断一个栈S是否为空。若S为空,则返回ture,否则返回false

顺序存储的实现

顺序栈的定义

image-20220818223038755

初始化操作

image-20220818223106704

image-20220818223142164

进栈操作

image-20220818223520713

出栈操作

image-20220818224009171

读栈顶元素操作

image-20220818224227042

队列的基本概念

队列(Queue)是只允许在一段进行插入,在另一端删除的线性表

image-20220819215551813

队列的基本操作

image-20220819215649674

image-20220819215730565

队列的顺序实现

image-20220819225234529

初始化操作

image-20220820160516315

image-20220820160542547

入队操作

image-20220820161025728

循环队列

image-20220820161117643

image-20220820161257135

出队操作

image-20220820161620347

判断队列已满/已空

队列已满的条件:队尾指针的再下一个位置是队头,即(Q.rear+1)%MaxSize==Q.front

队空条件:Q.rear==Q.front

image-20220820194352175

image-20220820194436680

队列的链式实现

image-20220820204043731

初始化(带头结点)

image-20220820204242796

image-20220820205626627

初始化(不带头结点)

image-20220820205718033

入队(带头结点)

image-20220820210450571

入队(不带头结点)

image-20220820213726066

出队(带头结点)

image-20220820215413765

出队(不带头结点)

image-20220820215542865

双端队列

双端队列:只允许从两端插入、两端删除的线性表

输入受限的双端队列:只允许从一端插入、两端删除的线性表

输出受限的双端队列:只允许从两端插入、一端删除的线性表

栈在括号匹配中的应用

image-20220821102128166

image-20220821102522183

算法实现

image-20220821102606340

栈在表达式求值中的应用

中缀、后缀、前缀表达式

image-20220821105209848

中缀表达式转后缀表达式

image-20220821105431681

“左优先”原则:只要左边的运算符能先计算,就优先算左边的

后缀表达式的计算

image-20220821115153770

后缀表达式的手算方法:

从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数

注意:两个操作数的左右顺序

后缀表达式的计算(机算)

用栈实现后缀表达式的计算:

  1. 从左往右扫描下一个元素,直到处理完所有元素
  2. 若扫描到操作数则压入栈,并回到1;否则执行3
  3. 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到1

中缀表达式转前缀表达式(手算)

image-20220821120359162

image-20220821120455336

右优先:

image-20220821120607192

前缀表达式的计算

用栈实现前缀表达式的计算:

  1. 从右往左扫描下一个元素,直到处理完所有元素
  2. 若扫描到操作数则压入栈,并回到1;否则执行3
  3. 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到1

中缀表达式转后缀表达式(机算)

image-20220821132729174

中缀表达式的计算(用栈实现)

image-20220821135343205