数据结构

1.  数据结构分为几类,请介绍下

分为二类,线性结构,非线性结构

线性结构:

1)线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系

2)线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的

3)链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息

4)线性结构常见的有:数组、队列、链表和栈

非线性结构:

非线性结构包括:二维数组,多维数组,广义表,树结构,图结构

2.  稀疏数组

介绍:

当数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组保存该数组

处理方法:

  1. 记录数组一共有几行几列,有多少个不同的值

  2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

应用实例:

  1. 保留类似二维数组(棋盘,地图)

  2. 把稀疏数组存盘,并且可以重新恢复原来的二维数组

思路:

 

 

二维数组转稀疏数组

  1. 遍历原始的二维数组,得到有效数据的个数 sum

  2. 根据sum创建稀疏数组sparsearr int[sum+1][3]

  3. 将二维数组的有效数据存入到稀疏数组中

稀疏数组转二维数组

  1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组

  2. 读取稀疏数组的后几行数据,并赋给原始的二维数组

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,所以此时队列并没有满。

 

数组模拟队列思路(循环队列):

  1. 定义maxSize(数组最大容量),front初始值(队头值为0),rear初始值(指向队列最后一个元素的后一个位置,空闲单元),数组(存放数据模拟队列)

  2. 新建方法将数组最大容量设置为maxSize

  3. 新建方法根据(rear+1)% maxSize == front判断队列是否为满

  4. 新建方法根据rear == front判断队列是否为空

  5. 新建添加队列方法,使用第3步判断队列是否为满,未满添加数据,使用rear =(rear+1)% maxSize将rear后移

  6. 新建出队列方法,使用第4步判断队列是否为空,不为空定义临时变量获取队列第一个元素,value = arr[front];使用front = (front+1)% maxSize将front后移,返回value

  7. 新建显示当前队列有效数据个数方法,根据(rear-front+maxSize)% maxSize将值返回,显示队列所有数据,判断队列是否为空,不为空for循环,i=front,i<front+队列数据个数System.out.printf("arr[%d]=%d ", i % maxSize, arr[i % maxSize]);

原文地址:https://www.cnblogs.com/kmcl1314/p/14596340.html