当前位置: 首页 > news >正文

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

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

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

注意:本文章使用的 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)

 本篇文章到此结束!

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

http://www.dtcms.com/a/346942.html

相关文章:

  • piecewise jerk算法介绍
  • 2025年音乐创作大模型有哪些?国内国外模型汇总以及优点分析
  • 高阶数据结构---ST表
  • 同类软件对比(一):Visual Studio(IDE) VS Visual Studio Code
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk
  • MySQL存储过程入门
  • OCR、文档解析工具合集(下)
  • MySQL InnoDB引擎
  • STM32F1 SysTick介绍及应用
  • Nacos-12--扩展:@RefreshScope和@ConfigurationProperties实现热更新的原理
  • PHP - 线程安全 - 疑问与答案
  • springboot 表现层消息一致性处理:前后端数据协议
  • SpringMVC相关自动配置
  • 第1篇:走进日志框架的世界 - 从HelloWorld到企业级应用
  • C++中, new对象时有哪几种情况会导致new失败
  • piclist+gitee操作指南
  • DeepSeek V3.1深度解析:一个模型两种思维,迈向Agent时代的第一步!
  • 屏幕类型与信号接口
  • 不用 if-else,Spring Boot 怎么知道 ?status=10 是哪个枚举?
  • 全面解析JVM预热:原理、价值与实践指南
  • Mybatis Plus - 代码生成器简单使用
  • SSE实时通信与前端联调实战
  • 内网穿透教程
  • 亚马逊布局墨西哥低价赛道:Amazon Bazaar的战略逻辑与卖家破局路径
  • STM32CubeIDE V1.9.0下载资源链接
  • 水体反光 + 遮挡难题破解!陌讯多模态融合算法在智慧水务的实测优化
  • RAG学习(六)——检索优化技术进阶
  • Sqlserver存储过程
  • 拼豆设计生成器(支持大写字母、数字,颜色自定义)
  • 力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流