3.栈在递归中的应用
函数调用的特点:最后被调用的函数最先执行结束
函数调用时,需要用一个栈存储:
- 调用返回地址
- 实参
- 局部变量
4.队列应用
- 树的层次遍历
- 图的广度优先遍历
- 操作系统——FCFS(先来先服务)
5.特殊矩阵的压缩
二维数组拥有随机存储的特性
行优先:
列优先:
注意:矩阵的行号和列号通常从1开始,而数组下标通常由0开始
5.1.对称矩阵的压缩存储
对称矩阵的特点是上三角和下三角的元素一一相等,因此,只要存储对角线元素+上三角元素(或下三角元素)
若存储的是下三角,采用行优先的原则存入数组中
1.数组大小:第一行1个,第二行2个,第三行3个……第n行n个
因此,数组大小为((1 + n) * n ) / 2
2.数组下标和矩阵元素的映射:
矩阵元素:a(i,j)
数组下标B[k]:k = 1 + 2 + …… + (i - 1) + j - 1 (-1是因为数组下标从0开始)
5.2.三角矩阵的压缩存储
与对称矩阵相同,存储上三角或者下三角,存储完成后,多加一个位置存储C
1.数组大小 ((1 + n) * n ) / 2 + 1
2.数组下标:
访问三角时,与对称矩阵相同;访问c时,访问数组的最后一个元素c
5.3.带状矩阵的压缩存储
1.存储策略:只存储中间的带状部分
2.特点 :除了第一行和最后一行是两个元素以外,每行是三个元素,因此,共(3n - 2)个元素,数组从0开始,因此,最后一个元素的数组下标为(3n - 3)
3.元素和数组下标的映射关系:a(i,j)
- 前i - 1行:(i - 1) * 3 - 1
- 第i行:j - i + 2
- a(i,j)是第2i + j - 2个元素
- 数组下标从0开始,因此数组下标为2i + j - 3
4. 已知B[k],如何得到i,j
- 数组下标为k,因此是第k+1个元素
- 前(i - 1)行元素总个数为(i - 1) * 3 - 1
- 前 i 行元素总个数为i * 3 - 1
- (i - 1) * 3 - 1 < k + 1 <= i * 3 - 1
- i = ⌈(k + 2) / 3
5.4.稀疏矩阵的压缩存储
- 顺序存储——三元表
- 链式存储——十字链表