数据结构复习笔记
- 数据结构
数组
数组是一种顺序式的存储同一类型数据的数据结构。
声明格式:<数据类型> <变量名称> [ ] = new <数据类型>[ <数组大小>]
链表
- 链表是一种有序的列表,串连的方式有两种
- 一种是利用数组结构串连的有序列表;如利用含有两个元素的结点构成的数组,一个元素存放数据、另一个元素存放链接关系。
- 另一种是以动态内存分配的链表;
class Node
{
int Data[ ]=new int[ArraySize]; //用于存储链表的数据
int Next[ ]=new int[ArraySize]; //用于存储下一个节点的位置
}
Node 变量名称=new Node();
- 单链表的基本操作
- 插入在链表开头:新的节点插入在链表的开头,需要将新节点的指针指向链表的首节点,并将链表的首节点设为新节点。
- 插入在链表中间:新的节点插入在链表的中间,如果我们找到Pointer节点,则需要将新节点的指针指向Pointer节点的指针(即下一个节点),但不能让链表断裂。所以第1步必须将新节点的指针指向Pointer节点的指针、第2步再将Pointer节点的指针指向新节点。
- 插入在链表尾端:新的节点插入在链表的尾端(Point节点),所以第1步必须将新节点的指针指向Pointer节点的指针(NULL)、第2步再将Pointer节点的指针指向新节点。
- 删除链表首节点:删除的节点在链表的开头,需要将首节点指向首节点的指针(即下一个节点),并将原来的节点从内在中释放。
- 删除链表中间节点:删除的节点在链表的中间,如果我们找到Pointer节点,则将前一个节点的指针指向Pointer节点的指针(即下一个节点)。并将原来的节点从内存中释放。
- 删除链表尾端的节点:删除的节点在链表的尾端(Pointer节点),如果我们Pointer节点,则需要将前一个节点的指针指向Pointer节点指针(NULL)。并将原来的节点从内存中释放。
- 单链表的反转、单链表的反转、双链表、循环链表。
- LinkedList类的使用方法,构造方法,类的方法。
堆栈
堆栈数据结构只允许数据自有序列列表的固定端(前端)做输入、输出操作,先进后出。堆栈是一种有序列表。
用数组模拟堆栈,堆栈数组声明:
int stack[MaxSize]; int top=-1;
- Stack类的使用、Stack类的方法
- 前序、中序、后序表达示的表示法及计算、以及表达式的转换
队列
规定在序列表中的数据的输入、输出是分别由不同端进行处理,具有先进先出的特性。
用数组模拟队列,队列数组声明:
int queue=new int[Maxsize];
int front=-1; //front会随数据输出而变动
int rear=-1; //rear会随数据输入而改变
- 环状队列
环状队列中的头指针所指向的数组位置并没有内容值存在,,输出的值为front的下一个元素,故环状队列实际上所能使用的空间为MaxSize-1。当尾指针rear等于MaxSize-1时需要回到队列的最前端,故当输入数据时,rear所指的数组元素下标采用这样的计算方法:
( rear + 1 ) mod MaxSize
若尾指针rear不断前进直到等于头指针front时,则表示队列已满,但当队列为空时rear也等于front,为区分这两种状况,必须使用不同的条件来加以判断。
当队列为满:( rear + 1 ) mod MaxSize=front
当队列为空:front = rear
- 双向队列
- 输入限制性双向队列:是限制只能在队列 的一端(后端)进行输入,而数据的输出则可在队列的两端(前后端)操作
- 输出限制性双向队列:是限制只能在队列 的一端(后端)进行输出,而数据的输入则可在队列的两端(前后端)操作
递归
是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象
- 数学问题
阶乘问题,最大公因子问题,费氏级数问题,组合公式,汉诺塔问题,N皇后问题,迷宫问题
树状结构
是由一个或多个节点所构成的有限集合。
- 二叉树
二叉树中的节点至多只能有两个子节点。
- 二叉树的数组表示法
- 二叉树的前序、中序、后序遍历
- 二叉树的查找、二叉树的节点删除
- 一般树转换为二叉树、线索二叉树
- 二叉树的应用(表达示)
内部排序
- 交换式排序
- 冒泡排序:将相邻的两个数据加以比较,若左边的值大于右边的值,则将此两个值互相交换;若左边的值小于等于右边的值,则此两个值的位置不变。右边的值继续和下一个值做比较,重复此操作,直到比较到最后一个值。
- 快速排序,步骤为:
1.从数列中挑出一个元素,称为 "基准"(pivot),
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
- 选择式排序
- 选择排序法:从欲排序的n个数据中,以线性查找的方法找出最小的元素和第一个元素交换,再从剩下的 ( n-1 )个数据中,找出最小的元素和第二个元素交换,以此类推,直到所有元素均已排序完成。
- 堆的外观为完全二叉树的最小或最大树,而堆排序(Heap Sort)所用的堆是"最大堆"。
- 插入式排序
- 插入排序法:假设欲排序的数组元素V1,V2,V3,V4且V3>V2>V4>V1。依序进行插入元素的操作,在每次插入时该元素会放在适当的排序位置,直到最后一个元素插入后,则所有元素排序完成。
- 希尔排序:将欲排序的数值依某个间隔长度分成数个数列集合,再针对各个数列集合进行"插入法排序",重复进行数列分割,每次分割的间隔长度缩小为上一次分割间隔长度的二分之一,直到分割间隔为零停止。
- 二叉树排序法:
- 将欲排序的元素一一以建立二叉树的方式插入,建立二叉树需满足二个条件:
- 每一个节点最多只有两个子节点( 左节点、右节点 )
- 若一个节点有子节点,则该节点的数据比左节点的数据大,且比右节点的数据小( 左节点<parent<右节点 )
- 使用二叉树中序遍历的方式将二叉树的节点打印出来,即可得到元素的排序结果。
外部排序
合并排序法:将欲排序的数据分别存在数个文件大小可加载内存的文件中,再针对各个文件分别使用"内部排序法"将文件中的数据排序好写回文件。再对所有已排序好的文件两两合并,直到所有文件合并成一个文件后,则数据排序完成。
查找
- 线性查找
- 线性查找又称为顺序查找,在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。
- 折半查找
- 若KeyValue小于Data[middle]:表示KeyValue可能出现在Data[middle]之前,所以查找Data[0]到Data[middle–1]之间的数据。这时left=left,right=middle-1,而middle=( left + right )/2
- 若KeyValue大于Data[middle]:表示KeyValue可能出现在Data[middle]之后,所以查找Data[middle+1]到Data[n]之间的数据。这时left=middle+1,right=right,而middle=(left + right)/2
- 若KeyValue等于Data[middle]:表示已查找到数据。
- 费氏查找、插补查找、杂凑查找、二叉树查找
复杂链表
- 循环链表
- 双向链表
图形结构
- 概念
- 无向图形
- 有向图形
- 完全图形
- 了图形
- 路径
- 简单路径
- 回路
- 连通顶点
- 连通图形
- 连通单元
- 强连通顶点
- 强连通图形
- 强连通单元
- 图形的表示法
- 邻接数组表示法
- 邻接表表示法
- 多重邻接表表示法
- 加权边的图形
- 图形的搜索
- 深度优先法
- 广度优先法
- 连通组件
- 生成树问题
- 生成树
- 最小生成树
- Kruskal算法
- Prims算法
- 最短路径问题