具有相同数据类型的 n (n ≥ 0) 个数据元素的有限序列,其中n为表长,当 n = 0 时线性表是一个空表。若用L命名线性表,则其一般表示为:
2、栈 (Stack) :只允许在一端进行插入或删除操作的线性表
4、逻辑结构:与普通线性表相同
5、数据的运算:插入、删除操作有区别
InitStack(&S):初始化栈。构造一个空栈 S,分配内存空间。
Pop(S, &x):读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素。
n 个不同元素进栈,出栈元素不同排列的个数为
上述公式称为卡特兰数,可采用数学归纳法证明
头插法建立单链表,插入元素代表进栈
逻辑结构、数据的运算、存储结构 (物理结构)
只允许在一端进行插入,在另一端删除的线性表
3、队列特点:先进先出
2.2 队列的基本操作
2.3 顺序存储实现队列
// 初始时 队头、队尾指针指向 0 // 判断队列是否为空 // 出队(删除一个队头元素,并用 x 返回) // 获得对头元素的值,并 x 返回
用上述方法实现的队列会比设定的 MaxSize 少存储一个数据(因为要实现队空和队满的判断),可以进行如下的改进:
3、队列的顺序实现小总结
2.4 队列的链式实现
1、代码(下面的代码有BUG,还没有修改,请暂时跳过)
// 判断队列是否为空
2、顺序存储和链式存储队满
顺序存储 —— 预先分配的空间耗尽
链式存储 —— 一般不会队满,除非内存不足
3.1 栈在括号匹配中应用
2、代码(先体跳过,后面手动实现一下)
1、表达式的三个组成部分
2、中缀、后缀、前缀表达式
3、中缀表达式转后缀表达式:
① 确定中缀表达式中各个运算符的运算顺序
② 选择下一个运算符,按照「左操作数右操作数运算符」的方式组合成一个新的操作数
③ 如果还有运算符没被处理,就继续 ②
因为运算顺序不唯一,因此对应的后缀表达式也不唯一,机算结果是前者(左优先,只要左边的运算符能先计算,就优先算左边的)
4、用栈实现后缀表达式的计算:
① 从左往右扫描下一个元素,直到处理完所有元素
② 若扫描到操作数则压入栈,并回到 ①;否则执行 ③
③ 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到 ①
5、中缀表达式转前缀表达式:
① 确定中缀表达式中各个运算符的运算顺序
② 选择下一一个运算符,按照「运算符左操作数右操作数」的方式组合成一个新的操作数
③ 如果还有运算符没被处理,就继续 ②(“右优先”原则:只要右边的运算符能先计算,就优先算右边的)
6、用栈实现前缀表达式的计算:
① 从右往左扫描下一个元素,直到处理完所有元素
② 若挡描到操作数则压人栈,并回到 ①;否则执行 ③
③ 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到 ①
7、中缀表达式转后缀表达式(机算)
初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况:
① 遇到操作数。直接加入后缀表达式。
② 遇到界限符。遇到“(” 直接入栈;遇到“)” 则依次弹出栈内运算符并加入后缀表达式,直到弹出“(”为止。注意:“(” 不加入后缀表达式。
③ 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(”或栈空则停止。之后再把当前运算符入栈。
按上述方法处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。
8、用栈实现中缀表达式的计算
初始化两个栈,操作数栈和运算符栈
若扫描到操作数,委入操作数栈
若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回操作数栈)
3.3 栈在递归中的应用
1、函数调用的特点:最后被调用的函数最先执行结束(LIFO)
将递归算法转换成对应的非递归算法时,通常需要使用栈来保存中间结果。
2、函数调用时,需要用一个栈存储:
(2) 求斐波那契数列
缺点:可能包含很多重复计算
每进入一层递归,就将递归调用所需信息压入栈顶
每退出一层递归,就从栈顶弹出相应信息
效率低,太多层递归可能会导致栈溢出;可能包含很多重复计算
改进可以自定义栈将递归算法改造成非递归算法
2、队列中存储的数据依次如下:
4.2 图的广度优先遍历
2、队列中存储的数据依次如下:
4.3 队列在操作系统中的应用
多个进程争抢着使用有限的系统资源时,FCFS(First Come First Service,先来先服务)是一种常用策略。
5.1 一维数组的存储结构
各数组元素大小相同,且物理上连续存放。
注:除非题目特别说明,否则数组下标默认从0开始
5.2 二维数组的存储结构
5.3 对称矩阵和上、下三角矩阵的压缩存储
普通存储: n * n 二维数组
压缩存储策略:只存储主对角线 + 下三角区(或主对角线 + 上三角区)
1、策略:只存储主对角线 + 下三角区列按行优先(行主序)将各元素存入一维数组中
2、策略:只存储主对角线+下三角区 按列优先(列主序)将各元素存入一维数组中。
3、下三角矩阵:除了主对角线和下三角区,其余的元素都相同
4、上三角矩阵:除了主对角线和上三角区,其余的元素都相同
5.4 三对角矩阵的压缩存储
压缩存储策略:按行优先(或列优先)原则,只存储带状部分
5.5 稀疏矩阵的压缩存储
稀疏矩阵:非零元素远远少于矩阵元素的个数
压缩存储策略:顺序存储——三元组<行, 列, 值>
【1】视频:王道计算机考研 数据结构