栈和队列

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

数据结构-栈和队列_后缀表达式

栈的基本操作

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

顺序存储的实现

顺序栈的定义

数据结构-栈和队列_算法_02

初始化操作

数据结构-栈和队列_算法_03

数据结构-栈和队列_算法_04

进栈操作

数据结构-栈和队列_数据结构_05

出栈操作

数据结构-栈和队列_头结点_06

读栈顶元素操作

数据结构-栈和队列_后缀表达式_07

队列的基本概念

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

数据结构-栈和队列_java_08

队列的基本操作

数据结构-栈和队列_算法_09

数据结构-栈和队列_java_10

队列的顺序实现

数据结构-栈和队列_后缀表达式_11

初始化操作

数据结构-栈和队列_算法_12

数据结构-栈和队列_后缀表达式_13

入队操作

数据结构-栈和队列_数据结构_14

循环队列

数据结构-栈和队列_java_15

数据结构-栈和队列_后缀表达式_16

出队操作

数据结构-栈和队列_头结点_17


判断队列已满/已空

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

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

数据结构-栈和队列_后缀表达式_18

数据结构-栈和队列_后缀表达式_19

队列的链式实现

数据结构-栈和队列_java_20

初始化(带头结点)

数据结构-栈和队列_java_21

数据结构-栈和队列_头结点_22

初始化(不带头结点)

数据结构-栈和队列_算法_23

入队(带头结点)

数据结构-栈和队列_后缀表达式_24

入队(不带头结点)

数据结构-栈和队列_头结点_25

出队(带头结点)

数据结构-栈和队列_头结点_26

出队(不带头结点)

数据结构-栈和队列_头结点_27

双端队列

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

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

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

栈在括号匹配中的应用

数据结构-栈和队列_后缀表达式_28

数据结构-栈和队列_头结点_29

算法实现

数据结构-栈和队列_数据结构_30

栈在表达式求值中的应用

中缀、后缀、前缀表达式

数据结构-栈和队列_头结点_31

中缀表达式转后缀表达式

数据结构-栈和队列_后缀表达式_32

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

后缀表达式的计算

数据结构-栈和队列_数据结构_33

后缀表达式的手算方法:

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

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

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

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

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

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

数据结构-栈和队列_算法_34

数据结构-栈和队列_头结点_35

右优先:

数据结构-栈和队列_java_36

前缀表达式的计算

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

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

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

数据结构-栈和队列_后缀表达式_37

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

数据结构-栈和队列_数据结构_38