数据结构的线性表:顺序表

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。常见的线性表:顺序表、链表、栈、队列...

今天,先来着重讲下顺序表。它的本质其实就是对数组的增删查改 。掌握了这个核心,顺序表学起来会轻松一些,并且在之后对于数组的处理速度就会更加地快速和方便。顺序表主要的方法有以下这些:

注意:本文章使用的 usedSize 表示此时数组元素个数(数组每被使用一个,usedSize ++)

先来看 display ,它用于打印顺序表,所以对于具体代码只需要遍历一下就可以了。

接下来是 add ,它是指增加元素(默认在末尾) 。既然是在末尾进行添加,那有可能数组原先就已经满了;也有可能没满,有两种情况。如果满了,我们要进行扩容。所以,判断满没满和扩容我们可以自定义两个方法 来实现。

然后还有一个 add(int pos,int data),这个是指在某个下标增加元素(默认是没满的) 。既然是以下标为判断依据,那么由于我们都是以 usedSize 来表示被使用数组个数,所以当 pos < 0时和 pos > usedSize 时,会抛出异常。所以这里我们就要分别写出是否有异常的判断。在这里,我们还可以运用到前两节学到的判断异常的方法来帮助我们:先定义一个包,然后使这个异常继承运行时异常,再对父类运行时异常进行初始化,再加上可能的自定义异常的方法,就可以了。

判断好之后,在 try { }内新增元素之前,我们需要把 pos 下标以后的元素向右边(数组的后面)进行挪动,这样才可以给出空间放下这个新增的pos。这里就可以使用循环了。

从这两个顺序表方法我们可以看出,在写程序时,得先把准备工作做好(判断出不正常运行的条件并编写代码),然后才轮到去写方法的具体实现。

下面是 contains,先传入一个 toFind值,来判断数组中书否包含这个值。注意返回值是 boolean。

然后是 set ,指的是把某个下标的值改为另一个值。比较简单,就一笔带过了。但是需要注意,要判断这个下标的元素是否为空和给出的下标是否不正确。总共有两个可能 catch 到的异常。

然后是 get ,代表是获取到某个下标的元素。同样我们要判断这个下标的元素是否为空和给出的下标是否不正确。

接下来是 clear ,是指清空数组中的所有元素。会与 add 相关联,比较特殊,如下图:

this.array [this.usedsize] = data; 所以当usedSize为0时,数组就被clear了。

如果数组是引用类型,则加上如下被注释的代码。

然后是 remove ,删除某个下标的元素。这时,我们得先判断这个下标的元素是不是空,不是则抛出异常。然后首先就是查找,这里我们可以使用 indexOf(用于寻找下标;找到则返回下标的数字,没找到则返回 -1)大家想一想,如果删去了。那这个下标的元素就没了,它所代表的内存也就没了。所以,我们需要将下标之后的元素分别移到它的前一个下标,使用循环,就可以完成了。

以上就是我们顺序表的全部方法,这里面方法的实现不唯一;大家可根据要求自由调整,上面只是举例。
在ArrayList中的创建也存在顺序表,但是有所区别。有些方法或参数 ArrayList 会直接提供,我们简单提取出一些源码来看看:

例如在下面这个方法中,某个条件产生了空数组,这里就直接用EMPTY_ELEMENTDATA 就可以了。

关于这个ArrayList用main函数如何去调用具体方法,如下图:

我们可以通过 List<Integer> list 来实例化一个一维数组;那么,二维数组该如何创建呢?

具体实现如下图:

下面是一道例题,我认为如果写出来了,基本可以掌握顺序表学习了。

118. 杨辉三角 - 力扣(LeetCode)

本篇文章到此结束!

本篇文章的截图和课件均摘自 比特科技 。希望能对你有帮助。。