大话数据结构学习笔记(4)

第四章 栈与队列

栈:栈是限定仅在表尾进行插入和删除操作的线性表。

我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈。栈由称为后进先出的线性表,简称LIFO结构。

栈的插入操作叫做进栈或入栈。删除操作叫做出栈。

image

栈的链式存储结构简称链栈。通常把栈顶放在表头。

如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈。

问:为什么要有栈这个数据结构?直接用用数组或链表不就行了吗?

答:栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。反之,像数组等,要分散精力区考虑数组的下标增减等细节问题,掩盖了问题的本质。

栈的应用-递归

递归函数:把一个直接调用自己或通过一系列的调用语句间接的调用自己的函数,称作递归函数。

在递归函数的前行阶段,对于每一层递归,函数的局部变量,参数值以及返回地址都被压入栈中。在回退阶段,位于栈顶的局部变量,参数值和返回地址被弹出栈,用于返回调用层次中执行代码的其余部分,也就是恢复了调用状态。

栈的应用-四则运算表达式求值

四则运算表达式 在运算是通常先转换成一种不需要括号的后缀表达法,称为逆波兰表示

叫后缀的的原因在于所有的符号都是要在运算数字的后面出现。

例如9+(3-1)X3+10÷2 可以表示成:9 3 1 - 3 * + 10 2 / +

计算规则:从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到是符号,就将位于栈顶的两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

以下是9 3 1 - 3 * + 10 2 / + 在计算机中的计算过程:

image
image
image
image

那么标准四则运算表达式(也叫做中缀表达式)是如何转成后缀表达式的?

image

规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即称为后缀表达式的一部分;若是符号则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号则栈顶符号依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

队列:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出的线性表,见车过FIFO,允许插入的一端称为队尾,允许删除的一端称为队头。

image

在可以确定队列长度最大值的情况下,建议用循环队列,如果无法预队列的长度,建议使用链队列。

本章小结:

image

推荐阅读更多精彩内容