【数据结构】 List与顺序表及接口的实现

文章目录

  • 什么是List
  • 常见接口介绍
  • 线性表
  • 顺序表
    • 顺序表接口的实现
      • add在末尾新增元素
      • 在 pos 位置新增元素
      • 判定是否包含某个元素
      • 查找某个元素对应的位置
      • 获取 pos 位置的元素
      • 给 pos 位置的元素设为 value
      • 删除第一次出现的关键字key
      • 获取顺序表的长度
      • 清空顺序表
  • 顺序表的优缺点
    • 优点:
    • 缺点:
  • 总结

什么是List

在集合框架中,List是一个接口,继承自Collection。
在这里插入图片描述
Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:
在这里插入图片描述
Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:
在这里插入图片描述
List 的官方文档

站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。

常见接口介绍

List中提供了好的方法,具体如下:
在这里插入图片描述
虽然方法比较多,但是常用方法如下:
在这里插入图片描述
注意:List是个接口,并不能直接用来实例化

线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
在这里插入图片描述

顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。

在数组上完成数据的增删查改

顺序表接口的实现

我们现在有这样一个SepList接口为:

public interface SepList  {// 新增元素,默认在数组最后新增void add(int data);// 在 pos 位置新增元素void add(int pos, int data);// 判定是否包含某个元素boolean contains(int toFind);// 查找某个元素对应的位置int indexOf(int toFind);// 获取 pos 位置的元素int get(int pos);// 给 pos 位置的元素设为 valuevoid set(int pos, int value);//删除第一次出现的关键字keyvoid remove(int key);// 获取顺序表长度int size();// 清空顺序表void clear();
}

这里博主将在一个MyArrayList类里面实现这些接口

public class MyArrayList implements SepList  {private int[] elem;//数组private int usedSize;//记录有效的数据的个数private static final int DEFAULT_SIZE = 10;//最初的数据容量public MyArrayList() {this.elem = new int[DEFAULT_SIZE];}// 新增元素,默认在数组最后新增public void add(int data) { }// 在 pos 位置新增元素public void add(int pos, int data) { }// 判定是否包含某个元素public boolean contains(int toFind) { return true; }// 查找某个元素对应的位置public int indexOf(int toFind) { return -1; }// 获取 pos 位置的元素public int get(int pos) { return -1; }// 给 pos 位置的元素设为 valuepublic void set(int pos, int value) { }//删除第一次出现的关键字keypublic void remove(int key) { }// 获取顺序表长度public int size() { return 0; }// 清空顺序表public void clear() { }
}

add在末尾新增元素

在增加一个元素前,我们需要对该顺序表进行判断,判断是否已满,若满则需要进行扩容

每增加一个元素,我们我们记录有效个数的usedSize加1

// 新增元素,默认在数组最后新增public void add(int data) {//判断数组是否已经被装满if(usedSize >= this.elem.length) {//被装满后需要进行扩容this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}this.elem[this.usedSize] = data;usedSize++;}

在 pos 位置新增元素

在增加一个元素前,我们需要对该顺序表进行判断,判断是否已满,若满则需要进行扩容

我们还需要多pos进行一个判断,判断它是否合法,如果不合法,我们抛出异常进行提醒
在这里插入图片描述

在pos位置增加元素,需要将pos位置及以后的元素进行后移一位,然后再在pos位置新增元素
在这里插入图片描述

每增加一个元素,我们我们记录有效个数的usedSize加1

//自定义异常
class PosWrongfulException extends RuntimeException {public PosWrongfulException(String message) {super(message);}
}// 在 pos 位置新增元素public void add(int pos, int data) throws PosWrongfulException {//判断数组是否已经被转满if(usedSize >= this.elem.length) {//被装满后需要进行扩容this.elem = Arrays.copyOf(this.elem,2*this.elem.length);}if(pos < 0 || pos > this.usedSize) {System.out.println("pos位置不合法!");throw new PosWrongfulException("pos位置不合法");}for(int i = this.usedSize;i >= pos;i--) {//pos位置以及pos位置以后的数据整体进行后移this.elem[i] = this.elem[i-1];}this.elem[pos] = data;usedSize++;}

判定是否包含某个元素

遍历即可

// 判定是否包含某个元素public boolean contains(int toFind) {for(int i = 0;i < this.usedSize;i++) {if(this.elem[i] == toFind) {return true;}}return false;}

查找某个元素对应的位置

对数组进行遍历,有的话返回相应的数组下标就好,没有返回-1

// 查找某个元素对应的位置public int indexOf(int toFind) {for(int i = 0;i < this.usedSize;i++) {if(this.elem[i] == toFind) {return i;}}return -1;}

获取 pos 位置的元素

获取前我们得进行判断,该顺序表类元素不能为空

我们还得对pos进行是否合法得判断

//自定义的异常
class PosWrongfulException extends RuntimeException {public PosWrongfulException(String message) {super(message);}
}
class EmptyException extends RuntimeException {public EmptyException(String message) {super(message);}
}// 获取 pos 位置的元素public int get(int pos)throws PosWrongfulException {if(this.usedSize == 0){throw new EmptyException("当前顺序表为空!");}if(pos < 0 || pos > this.usedSize) {System.out.println("pos位置不合法!");throw new PosWrongfulException("pos位置不合法");}return this.elem[pos];}

给 pos 位置的元素设为 value

我们依旧需要判断pos的合法性,前面已经自定义了该异常,这里就不再进行定义了

然后将pos位置的元素改为value就好

// 给 pos 位置的元素设为 valuepublic void set(int pos, int value) {if(pos < 0 || pos > this.usedSize) {System.out.println("pos位置不合法!");throw new PosWrongfulException("pos位置不合法");}this.elem[pos] = value;}

删除第一次出现的关键字key

我们依旧需要判断数组是否为空

遍历数组,若没有我们要删除的元素,我们便进行提示后退出

若有,则只需要用后面的数据对前面进行覆盖就好

 //删除第一次出现的关键字keypublic void remove(int key) {if(this.usedSize == 0) {throw new EmptyException("顺序表为空!");}int index = this.indexOf(key);if(index == -1) {System.out.println("没有这个数字");return;}//进行覆盖for (int i = index; i < size()-1; i++) {this.elem[i] = this.elem[i+1];}//如果不是基本类型,将usedSize下标置为空//this.elem[this.usedSize] = null;this.usedSize--;}

获取顺序表的长度

这个就非常简单了,只需要返回usedSize就好

 // 获取顺序表长度public int size() {  return this.usedSize;}

清空顺序表

对于当前基本类型的数据来说,只需要将usedSize置为0就好

 public void clear() {this.usedSize=0;}

顺序表的优缺点

线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数不太变化,而更多是存取数据的应用。当然,它的优缺点还不只这些……

优点:

无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以快速地存取表中任一位置的元素

缺点:

插入删除操作需要移动大量元素,当线性表长度变化较大时,难以确定存储空间的容量,造成存储空间的碎片

总结

关于《【数据结构】 List与顺序表及接口的实现》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt应用开发(基础篇)——滚屏区域基类 QAbstractScrollArea

一、前言 QAbstractScrollArea滚屏区域抽象类继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是QListview(列表浏览器)、QTableview(表格浏览器)、QTextEdit(文本编辑器)、QTextBrowser(文本浏览器)等所有需要滚屏区域部件的抽象基类。 框架类QFrame介绍 QAbstractSc…

java之juc二

JMM 请你谈谈对Volatile的理解 Volatile是jvm提供的轻量级的同步机制&#xff08;和synchronized差不多&#xff0c;但是没有synchronized那么强大&#xff09; 保证可见性不保证原子性禁止指令重排 什么是JMM JMM&#xff1a;java内存模型&#xff0c;不存在的东西&#…

一.RocketMQ概念

RocketMQ概念 1.概念2.应用场景3.MQ的优点和缺点4.常见MQ对比 1.概念 MQ(Message Queue)&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件&#xff0c;是一套提供了消息生产、存储、消费全过程API的软件系统。 RocketMQ是阿里巴巴2016年MQ中间件&…

华为云classroom赋能--Devstar使应用开发无需从零开始

华为云DevStar为开发者提供业界主流框架代码初始化能力&#xff0c;通过GUI、API、CLI等多种方式&#xff0c;将按模板生成框架代码的能力推送至用户桌面。同时基于华为云服务资源、成熟的DevOps开发工具链和面向多场景的众多开发模板&#xff0c;提供一站式创建代码仓、自动生…

【golang】数组和切片底层原理

数组类型的值&#xff08;以下简称数组&#xff09;的长度是固定的&#xff0c;而切片类型的值&#xff08;以下简称切片&#xff09;是可变长的。 数组的长度在声明它的时候就必须给定&#xff0c;并且之后不会再改变。可以说&#xff0c;数组的长度是其类型的一部分。比如&a…

深入探索JavaEE单体架构、微服务架构与云原生架构

课程链接&#xff1a; 链接: https://pan.baidu.com/s/1xSI1ofwYXfqOchfwszCZnA?pwd4s99 提取码: 4s99 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍&#xff1a; &#x1f50d;【00】模块零&#xff1a;开营直播&a…

ARM-M0内核MCU,内置24bit ADC,采样率4KSPS,传感器、电子秤、体脂秤专用,国产IC

ARM-M0内核MCU 内置24bit ADC &#xff0c;采样率4KSPS flash 64KB&#xff0c;SRAM 32KB 适用于传感器&#xff0c;电子秤&#xff0c;体脂秤等等

[BitSail] Connector开发详解系列三:SourceReader

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 Source Connector 本文将主要介绍负责数据读取的组件SourceReader&#xff1a; SourceReader 每个SourceReader都在独立的线程中执行&#xff0c;只要我们保证Sou…

Jmeter进阶使用:BeanShell实现接口前置和后置操作

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…

c语言——拷贝数组

这段代码是一个简单的数组拷贝示例。它的功能是将一个原始数组 original 的内容拷贝到另一个数组 copied 中&#xff0c;并输出两个数组的元素。 代码执行过程如下&#xff1a; 首先&#xff0c;在 main() 函数中定义了一个整型数组 original&#xff0c;并初始化了它的元素。…

物联网在制造业中的应用

制造业目前正在经历第四次工业革命&#xff0c;物联网、人工智能和机器人等技术进步正在推动行业的发展。研究表明&#xff0c;到2024年&#xff0c;全球制造商将在物联网解决方案上投资700亿美元&#xff0c;许多制造商正在实施物联网设备&#xff0c;以利用预测性维护和复杂的…

接口测试工具——Postman测试工具 Swagger接口测试+SpringBoot整合 JMeter高并发测试工具

目录 Postman测试工具接口测试工具swaggerKnife4j1.引入依赖2.配置3.常用注解4.接口测试 JMeter什么是JMeter?JMeter安装配置1.官网下载2.下载后解压3.汉语设置 JMeter的使用方法1.新建线程组2.设置参数3.添加取样器4.设置参数&#xff1a;协议&#xff0c;ip&#xff0c;端口…

SDK是什么,SDK和API有什么区别

SDK&#xff08;Software Development Kit&#xff09;是一种开发工具包&#xff0c;通常由软件开发公司或平台提供&#xff0c;用于帮助开发人员构建、测试和集成特定平台或软件的应用程序。SDK 包含一系列的库、工具、示例代码和文档&#xff0c;旨在简化开发过程并提供所需的…

基于Mysql+Vue+Django的协同过滤和内容推荐算法的智能音乐推荐系统——深度学习算法应用(含全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境MySQL环境VUE环境 模块实现1. 数据请求和储存2. 数据处理计算歌曲、歌手、用户相似度计算用户推荐集 3. 数据存储与后台4. 数据展示 系统测试工程源代码下载其它资料下载 前言 本项目以丰富的网易云音乐数据为基…

SQLSERVER 查询语句加with (NOLOCK) 报ORDER BY 报错 除非另外还指定了 TOP、OFFSET 或 FOR XML

最近有一个项目在客户使用时发现死锁问题&#xff0c;用的数据库是SQLSERVER &#xff0c;死锁的原因是有的客户经常去点报表&#xff0c;报表查询时间又慢&#xff0c;然后又有人在做单导致了死锁&#xff0c;然后主管要我们用SQLSERVER查询时要加with (NOLOCK),但是我在加完 …

2023骨传导耳机推荐,适合运动骨传导耳机推荐

相信很多人跟我一样&#xff0c;随着现在五花八门的耳机品种增多&#xff0c;选耳机的时候真是眼花缭乱&#xff0c;尤其还是网购&#xff0c;只能看&#xff0c;不能试&#xff0c;所以选择起来比较困难&#xff0c; 作为一个运动达人&#xff0c;为了让大家在购买耳机时少走弯…

〔012〕Stable Diffusion 之 中文提示词自动翻译插件 篇

✨ 目录 &#x1f388; 翻译插件&#x1f388; 下载谷歌翻译&#x1f388; 谷歌翻译使用方法&#x1f388; 谷歌翻译使用效果 &#x1f388; 翻译插件 在插件列表中搜索 Prompt Translator可以看到有2个插件选项&#xff1a;一个是基于谷歌翻译 〔推荐〕、一个基于百度和deepl…

奥威BI财务数据分析方案:借BI之利,成就智能财务分析

随着智能技术的发展&#xff0c;各行各业都走上借助智能技术高效运作道路&#xff0c;财务数据分析也不例外。借助BI商业智能技术能够让财务数据分析更高效、便捷、直观立体&#xff0c;也更有助于发挥财务数据分析作为企业经营管理健康晴雨表的作用。随着BI财务数据分析经验的…

【RP2040】香瓜树莓派RP2040之新建工程

本文最后修改时间&#xff1a;2022年09月05日 11:02 一、本节简介 本节介绍如何新建一个自己的工程。 二、实验平台 1、硬件平台 1&#xff09;树莓派pico开发板 ①树莓派pico开发板*2 ②micro usb数据线*2 2&#xff09;电脑 2、软件平台 1&#xff09;VS CODE 三、版…

【C++】一文带你初识C++继承

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C类 ♈️今日夜电波&#xff1a;napori—Vaundy 1:21 ━━━━━━️&#x1f49f;──────── 3:23 …