栈和队列
栈
栈是只允许在一端进行插入或删除操作的线性表
栈的基本操作
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
顺序存储的实现
顺序栈的定义
初始化操作
进栈操作
出栈操作
读栈顶元素操作
队列的基本概念
队列(Queue)是只允许在一段进行插入,在另一端删除的线性表
队列的基本操作
队列的顺序实现
初始化操作
入队操作
循环队列
出队操作
判断队列已满/已空
队列已满的条件:队尾指针的再下一个位置是队头,即(Q.rear+1)%MaxSize==Q.front
队空条件:Q.rear==Q.front
队列的链式实现
初始化(带头结点)
初始化(不带头结点)
入队(带头结点)
入队(不带头结点)
出队(带头结点)
出队(不带头结点)
双端队列
双端队列:只允许从两端插入、两端删除的线性表
输入受限的双端队列:只允许从一端插入、两端删除的线性表
输出受限的双端队列:只允许从两端插入、一端删除的线性表
栈在括号匹配中的应用
算法实现
栈在表达式求值中的应用
中缀、后缀、前缀表达式
中缀表达式转后缀表达式
“左优先”原则:只要左边的运算符能先计算,就优先算左边的
后缀表达式的计算
后缀表达式的手算方法:
从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数
注意:两个操作数的左右顺序
后缀表达式的计算(机算)
用栈实现后缀表达式的计算:
- 从左往右扫描下一个元素,直到处理完所有元素
- 若扫描到操作数则压入栈,并回到1;否则执行3
- 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到1
中缀表达式转前缀表达式(手算)
右优先:
前缀表达式的计算
用栈实现前缀表达式的计算:
- 从右往左扫描下一个元素,直到处理完所有元素
- 若扫描到操作数则压入栈,并回到1;否则执行3
- 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到1
中缀表达式转后缀表达式(机算)
中缀表达式的计算(用栈实现)