内容多基于王道和李春葆《数据结构教程》,做复习提纲之用
基本内容回顾
顺序队
队列是线性表(具有逻辑上的前驱后继关系)。头插尾删,先进先出。
队列的实现至少需要维护如下内容(一数组,二指针):
- 数组(定长,且知道大小)
 - 队首指针
front(指向队首元素) - 队尾指针
rear(指向队尾元素的下一个位置) 
队列的逻辑是环形使用数组,数组最后一个位置使用后接着使用第一个位置。通过对下标使用取余确保不会越界。
由于空队列时的条件为front==rear,若不加以修改,满队列条件实际上和这个一样,因此有三种策略:
- 少装一个元素,当
front == (rear+1)%MaxSize就认为满 - 多设置一个
size变量,入队自增,出队自减 - 设置
tag,入队置1,出队置0 
对3进行解释:只有在前一次操作插入才会导致队满,此时tag==1,故有判定条件为front == rear && tag == 1。同理只有在前一次操作删除才会导致队空满,此时tag==0,故有判定条件为front == rear && tag == 01
注意:
- 入队前需先判断是否满
 - 出队前需先判断是否空
 
链队
一般需要维护的如下:
- 链表节点(一般需要头结点,空的,初始化
malloc一个就行) - 两个指针(指向头结点和尾节点,
front == reat为空) 
链队一般不会满(除非没得内存),但是顺序队由于底层是定长数组,会满。
要点:
- 入队就尾插
 - 出队就
front->next - 删除节点记得释放空间
 
此外还有双端队列和循环队列,过于简单不做赘述
栈
后进先出
典型应用:
- 括号匹配
 - 树的某些遍历方法
 - 前中后缀表达式
 - 函数调用有调用栈
 
实现需要:
- 定长数组
 - 记录栈顶下标的int变量
top 
矩阵压缩
涉及:
- 压缩前后的下标转换
 - 上/下三角矩阵
 - 稀疏矩阵
 
涉及数据结构:
- 三元组
 - 十字链表法
 
串
[ADT笔记]串(String)及其C语言实现
串是特殊的线性表(线性表在逻辑上具有前驱和后继的关系)
实现:
#define maxsize 50
typedef struct
{
	char data[maxsize];
	//使用length可以把求长度的时间复杂度降为O(1)
	int length;
}SqString;
 
核心是char[],但是为了知道串长度有如下几种操作:
- 另设一个存放长度的
int(上例即是) data[0]存放长度(由于char占一个字节,所以串长不能超过256)- 使用
\0结尾,不存串长(那Getlength()无法降到 O ( 1 ) O(1) O(1),上两种方法倒是可以) 
注:串可以链式存储,但是每个节点存储一个char回导致存储密度降低。可以一个节点存一个块(一个块存多个字符)形成块链结构,缺点是增删麻烦。
其他:模式匹配问题(蛮力/KMP)
树
- 节点的度:节点有几个孩子
 - 树的度:各节点的度的最大值
 
度为n的树至少有一个节点的度为n,但是n叉树允许所有节点度小于n,甚至可以是空树
二叉树:
- 二叉树左右顺序要区分
 - 满二叉树:叶子结点全在最下面一层,非叶子结点均有两个子节点
 - 完全二叉树:深度为h的二叉树除第 h 层外其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边
 - 实现可以顺序存储或者链式存储
 
遍历一般依靠递归就够了:
- 前序:根左右
 - 中序:左根右
 - 后序:左右根
 
这里可以和上面提到的前中后缀表达式联系起来
线索二叉树:
线索二叉树的前提必须指明是那种遍历方式
就是在指定的遍历方式的情况下,节点会产生前驱/后继的关系(因为遍历会得到一个访问序列)。线索二叉树就是要为节点指明前驱后继,该过程称为线索化。
线索化要使用节点的空的指针,也就是说需要线索化处理的节点位于叶子结点或者孩子没满的节点。
typedef struct BiTree {
	struct BiTree *lchild, *rchild;	//左右子节点指针
	int data;	// 数据域
	// 左右标志,0 代表指向的是孩子,1代表指向的是前驱/后继
	int LTag;
	int RTag;
}BiNode;
 
对于这些指针,如果是左指针空,则用它指向前驱,且LTag置1;若右指针为空,则用它指向后继,且置RTag为1。通过Tag变量区分指向的到底是子节点还是前驱后继。
线索化时需要借助中变量temp保存前驱以供访问。这里还是得看代码才直观
森林或树转换到二叉树
- 森林中各个树的根结点之间视为兄弟关系
 - 按左孩子右兄弟存储
 
二叉搜索树BST
[算法笔记]树表的查找:BST与AVL
- 若根节点的左子树非空,则左子树上所有结点关键字均小于根节点关键字
 - 若根节点的右子树非空,则右子树上所有结点关键字均大于根节点关键字
 - 根节点的左、右子树本身又各是一棵二叉排序树
 
BST涉及平衡操作,AVL树就是一种平衡的二叉搜索树,涉及LL、RR、LR、RL四种过程
平衡二叉树:每个节点左右子树高度最多相差1
哈夫曼树
略
图
[ADT笔记]图(graph)
生成树:所有顶点均由边连接在一起但不存在回路的图
表示方法:
- 邻接矩阵
 - 邻接表
 - 十字链表
 
排序

[算法笔记]排序算法1:插入、选择和交换排序
[算法笔记]排序算法2:桶、计数与基数排序
其他补充
单链表 O ( 1 ) O(1) O(1)前插
bool InsertPriorNode(LNode *p, LNode *s){
    if(p==NULL || S==NULL)
        return false;
    // 常规尾插连接节点后交换数据域
    s->next = p->next;
    p->next = s;  // s连接到p
    ELemType temp = p->data;  // 交换数据域部分
    p->data = s->data;
    s->data = temp;
    return true;
}
                













![[前端笔记——WEB基础] 1.WEB基本概念](https://img-blog.csdnimg.cn/82d7df4ff0b2451b9cb26c015f7ce2cb.png)




