1. 数据结构分为几类,请介绍下
分为二类,线性结构,非线性结构
线性结构:
1)线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系
2)线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的
3)链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
4)线性结构常见的有:数组、队列、链表和栈
非线性结构:
非线性结构包括:二维数组,多维数组,广义表,树结构,图结构
2. 稀疏数组
介绍:
当数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组保存该数组
处理方法:
-
记录数组一共有几行几列,有多少个不同的值
-
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
应用实例:
-
保留类似二维数组(棋盘,地图)
-
把稀疏数组存盘,并且可以重新恢复原来的二维数组
思路:
二维数组转稀疏数组
-
遍历原始的二维数组,得到有效数据的个数 sum
-
根据sum创建稀疏数组sparsearr int[sum+1][3]
-
将二维数组的有效数据存入到稀疏数组中
稀疏数组转二维数组
-
先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
-
读取稀疏数组的后几行数据,并赋给原始的二维数组
3. 队列
介绍:
队列是一个有序列表,可以用数组或链表来实现
遵循先入先出的原则。
循环队列定义:
把队列的这种头尾相接的顺序存储结构称为循环队列。
数组实现队列:
图例说明:
初始ManxSize为5,front=rear时队列为空,添加a1-a4数据,front为0不变,rear向后移
a1.a2出队列时front向后移,rear指针不变
添加数据a5a6,rear向后移
但是在添加a7时,rear和front指针重叠表示队列为空,为解决方法当队列满时,数组应该还有一个空闲单元让rear指针应指向预留空闲单元
由于rear可能比front大,也可能比front小,所以尽管它们只相差一个位置时就是满的情况,但也可能是相差整整一圈。所有队列最大值为maxSize,队列满条件应为(rear+1)% maxSize == front,当maxSize为5如上图中的左图,front=0而rear=4,(4+1)%5=0,所以此时队列满。再比如上图中的右图,front=2而rear=1。(1+1)%5=2,所以此时队列也是满的。而对于下图,front=2而rear=0,(0+1)%5=1,1≠2,所以此时队列并没有满。
数组模拟队列思路(循环队列):
-
定义maxSize(数组最大容量),front初始值(队头值为0),rear初始值(指向队列最后一个元素的后一个位置,空闲单元),数组(存放数据模拟队列)
-
新建方法将数组最大容量设置为maxSize
-
新建方法根据(rear+1)% maxSize == front判断队列是否为满
-
新建方法根据rear == front判断队列是否为空
-
新建添加队列方法,使用第3步判断队列是否为满,未满添加数据,使用rear =(rear+1)% maxSize将rear后移
-
新建出队列方法,使用第4步判断队列是否为空,不为空定义临时变量获取队列第一个元素,value = arr[front];使用front = (front+1)% maxSize将front后移,返回value
-
新建显示当前队列有效数据个数方法,根据(rear-front+maxSize)% maxSize将值返回,显示队列所有数据,判断队列是否为空,不为空for循环,i=front,i<front+队列数据个数System.out.printf("arr[%d]=%d ", i % maxSize, arr[i % maxSize]);