数据结构
1.线性表
暂略
2.栈与队列
2.1 顺序栈
后进先出结构(LIFO)
2.1.1 栈定义:
动态:
1 | typedef struct Node{ |
栈结构不存在:
S.base = NULL;
空栈:
S.base = S.top;
栈满:
S.top - S.base >= S.stacksize;
静态:
1 | typedef struct Node{ |
空栈:
top = -1;
栈满:
top = MAXSIZE - 1;
注意:top指向栈顶元素的下一个位置,而不是栈顶。所以后续操作中对top都是先用后加。
2.1.2基本运算:
- InitStack(&S) 初始化,创建一个空栈
- Push(&S, e) 插入e为新的栈顶元素
- Pop(&S, &e) 删除栈顶元素,返回e
- GetTop(S, &e) 用e返回栈顶元素
- StackEmpty(S) 判断是否存在
(详见代码复习文档)
2.2 链栈
指针指向: 从 n -> 1,栈底元素是 a1;无头节点,头指针就是栈顶指针,栈空 S = NULL
2.2.1 链栈定义
1 | typedef struct STNode{ |
链栈的优势:不会出现栈满的情况
2.3 链队列
先进先出结构(FIFO)
2.3.1 类型定义
1 | typedef struct QNode{ |
对于非空队列,rear指针始终指向队尾的下一位置。
2.3.2 基本运算
- InitQueue(&Q) 初始化,设置一个空队列
- EnQueue(&Q, e) 插入e
- DeQueue(&Q, &e) 删除队头
- GetHead(Q, &e) 读取队头
- QueueEmpty(S) 判空
(详见代码复习文档)
2.3.3 循环队列
- 尾指针增1:Q.rear = (Q.rear + 1) % SIZE;
- 头指针增1:Q.front = (Q.front + 1) % SIZE;
- 队列空:Q.raer = Q.front;
- 队列满:(Q.rear + 1) % SIZE = Q.front;
- 元素个数:(Q.rear - Q.front + SIZE) % SIZE;
3. 串
空串是任意串的子串,任意串是其自身的子串。
对于字符串的考察应该只局限在概念层面,顶多也就求个next值完事了。
3.1 串的存储
3.1.1 顺序存储
1 | typedef struct{ |
3.2 基本运算
- StrAssign(&S, chars) 串赋值
- StrCompare(S, T) 串比较
- StrLength(S) 求串长
- Concat(&T, S1, S2) 串连接:将S1和S2连接到新串T上
- SubString(&Sub, S, pos, len) 求子串(起始位置 + 长度)
- StrCopy(&T, S) 串复制
- Index(S, T, pos) 子串定位
3.3 KMP
学校教的next数组的值为:
对于next[j],它的值等于前 j-1 位数字真前缀的值 - 1
逆天!
4. 数组与广义表
4.1 数组
$Loc(a_{ij}) = Loc(a_{11}) + [(j-1)*(m或n) + i - 1] * d$ ,d为字节数
乘m或n取决于行优先还是列优先
4.2 矩阵
特殊矩阵的压缩存储:
(公式)
稀疏矩阵的压缩存储:
存储的是一个三元组(i,j,v),表示行,列,值
存储顺序是先行优先再列优先
转置的两种方式:第一种是直接swap(i,j)后再按行优先列优先sort;第二种是计算行列元素个数提前预判元素的位置,省去排序的过程