稀疏数组与队列

数据结构与算法

​ 外修语言,内修算法,数据结构+算法是一个程序运行的保障,数据结构指的是数据的组成方式,如数组、数和链表等。数据结构可以分为线性数据结构和非线性数据结构,线性结构的特点是数据元素之间存在一一对应的关系,存储方式可以分为顺序表和链表,两者最大的不同在于存储的地址是否连续,典型的线性结构为数组、链表、队列和栈。非线性结构的特点是数据元素之间不存在一一对应的关系,典型的非线性结构有二维数组、多维数组、广义表和数结构

一、数组

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])
    }
    
发布了71 篇原创文章 · 获赞 42 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/dreame_life/article/details/104118823