数据结构与算法
外修语言,内修算法,数据结构+算法是一个程序运行的保障,数据结构指的是数据的组成方式,如数组、数和链表等。数据结构可以分为线性数据结构和非线性数据结构,线性结构的特点是数据元素之间存在一一对应的关系,存储方式可以分为顺序表和链表,两者最大的不同在于存储的地址是否连续,典型的线性结构为数组、链表、队列和栈。非线性结构的特点是数据元素之间不存在一一对应的关系,典型的非线性结构有二维数组、多维数组、广义表和数结构
一、数组
1、稀疏数组
若一个二维数组中的元素存在很多0值或者无效值,可以将这个二维数组压缩为稀疏数组(去除0值和无效值)。可以应用在底图、棋盘等二维场景中。
1.1二维数组转稀疏数组
①遍历原始的二维数组,得到有效的数据个数sum
②构造稀疏数组,第一行原始数组的行、列和有效数据的个数,其余行为有效值的行列坐标和存储的值
sparseArr[sum+1][3]
1.2稀疏数组转二维数组
①取出稀疏数组的第一行,构造二维数组
②取出稀疏数组的其余行,为对应的二维数组赋值。
2、队列(数组实现)
队列如同现实中的排队一样,它的特点是先入先出,是一种有序列表,可有由数组或者是链表构成。
2.1数组模拟队列
队列的输入输出分别队列的后、前端。对应的处理方法为加入数据和输出数据。(其前提是插入元素的个数要小于数组容量的个数,否则会发生越界错误,因为tail是指向队尾的后一个位置)
- 构造队列
- 判断队列是否为空 head !=tail
- 队列是否满 tail !=maxSize
- 加入队列 (先加入,后tail++)
- 退出队列
对用的属性为maxSize、head(队头)、tail(队尾的后一个元素位置)
2.2环形队列
基本数组模拟队列会导致数组不能复用,所以优化方法是让数组构成环形队列。
环形队列的基本思想是首尾相连。
-
构造队列
-
判断队列是否有空位置 head!=tail
-
判断队列是否满 (tail+1)%maxSize==head
-
加入队列,更新队头(tail+1)%maxSize
-
退出队列,更新队尾(head+1)%maxSize
-
队列长度(tail+maxSize-head)%maxSize
-
队列的索引变为 :
for(i=head;i<head+(tail+maxSize-head)%maxSize;i++){ System.out.println(arr[i%maxSize]) }