【数据结构与算法】3.顺序表

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!


文章目录

  • 1.线性表
  • 2. 顺序表
    • 2.1 顺序表结构
    • 2.2 实现顺序表接口
    • 2.3 打印顺序表
    • 2.2 实现新增元素
    • 2.3 实现查找元素
    • 2.3 获取指定位置的值
    • 2.4 删除元素
    • 2.5 获取顺序表的长度
    • 2.6 清空顺序表
  • 3.代码

1.线性表

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

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

image-20231213190401568

2. 顺序表

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

2.1 顺序表结构

代码实现:

public class MyArrayList implements IList{public int[] elem;public int usedSize; // 记录数组元素个数public static final int DEFAULT_CAACITY = 5; // 默认容量public MyArrayList() {elem = new int[DEFAULT_CAACITY];}
}

2.2 实现顺序表接口

代码实现:

public interface IList {// 新增元素,默认在数组最后新增public void add(int data);// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某个元素public boolean contains(int toFind);// 查找某个元素对应的位置public int indexOf(int toFind);// 获取 pos 位置的元素public int get(int pos);// 给 pos 位置的元素设为 valuepublic void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove);// 获取顺序表长度public int size();// 清空顺序表public void clear();// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display();// 判断数组是否存满元素public boolean isFull();// 判断数组是否为空public boolean isEmpty();
}

2.3 打印顺序表

代码实现:

	/*** 打印顺序表的所有的元素*/@Overridepublic void display() {for (int i = 0; i < usedSize; i++) {System.out.print(elem[i] + " ");}System.out.println();}

2.2 实现新增元素

新增元素思想:

  1. 判断数组是否存满元素,如果存满则增加容量,否则存储在elem[usedSize]位置
  2. 判断pos位置是否合法,则抛出异常
  3. 从最后一个元素开始先前遍历到pos位置,分别将它们都向后移动一个位置,再将元素存放到pos位置

代码实现:

	/**** 添加元素,默认添加到数组的最后位置* @param data*/@Overridepublic void add(int data) {// 1.判断是否满了 满了就要扩容if (isFull()) {expansion();}elem[usedSize] = data;usedSize++;}/**** 给pos位置添加元素data* 从后往前移动元素 再将元素放进数组* @param pos* @param data*/@Overridepublic void add(int pos, int data) {checkPosOfAdd(pos);if (isFull()) {expansion();}for (int i = usedSize - 1; i >= pos; i--) {elem[i + 1] = elem[i];}elem[pos] = data;usedSize++;}/**** 判断数组是否存满* @return*/@Overridepublic boolean isFull() {return usedSize == elem.length;}/*** 扩容数组*/public void expansion() {elem = Arrays.copyOf(elem, 2 * elem.length);}/*** 判断pos位置是否合法* @param pos*/private void checkPosOfAdd(int pos) {if (pos < 0 || pos > usedSize) {throw new PosException("pos位置:" + pos);}}

异常类:

public class PosException extends RuntimeException {public PosException() {}public PosException(String msg) {super(msg);}
}

2.3 实现查找元素

代码实现:

	/**** 查找当前元素,是否存在* @param toFind* @return*/@Overridepublic boolean contains(int toFind) {for (int i = 0; i < usedSize; i++) {if (toFind == elem[i]) {return true;}}return false;}/**** 查找当前元素,并返回下标* @param toFind* @return*/@Overridepublic int indexOf(int toFind) {for (int i = 0; i < usedSize; i++) {if (toFind == elem[i]) {return i;}}return -1;}

2.3 获取指定位置的值

思路:

  1. 判断pos位置是否合法,则抛出异常
  2. 判断数组是否为空,否则抛出异常
  3. 返回elem[pos]的值

代码实现:

	/**** 获取pos位置的值* @param pos* @return*/@Overridepublic int get(int pos) {// 1.判断pos是否合法checkPosOfGet(pos);// 2.判断数组是否为空if (isEmpty()) {throw new EmptyException("顺序表为空");}return elem[pos];}/*** 判断pos是否合法* @param pos*/private void checkPosOfGet(int pos) {if (pos < 0 || pos >= usedSize) {throw new PosException("pos位置:" + pos);}}/**** 判断数组是否为空* @return*/@Overridepublic boolean isEmpty() {return usedSize == 0;}

异常类:

public class EmptyException extends  RuntimeException {public EmptyException() {}public EmptyException(String msg) {super(msg);}
}

2.4 删除元素

思路:

  1. 判断顺序表是否为空,如果为空抛出异常
  2. 查找要删除的元素
  3. 从删除元素的下标遍历到usedSize - 1位置,分别将后一个元素移动到前几个位置。

代码实现:

	/**** 删除toRemove这个数字* @param toRemove*/@Overridepublic void remove(int toRemove) {// 1.判断数组是否为空if (isEmpty()) {throw new EmptyException("顺序表为空,不能删除");}int index = indexOf(toRemove);for (int i = index; i < usedSize - 1; i++) {elem[i] = elem[i + 1];}usedSize--;}

2.5 获取顺序表的长度

思路:顺序表的长度就等于usedSize的值

	/**** 获取顺序表的长度* @return*/@Overridepublic int size() {return this.usedSize;}

2.6 清空顺序表

思路:将usedSize的值置为空

	/**** 清空顺序表 防止内存泄漏*/@Overridepublic void clear() {usedSize = 0;}

3.代码

代码链接🔗

在这里插入图片描述

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

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

相关文章

软件设计师——软件工程(五)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

解读 EventBridge Transform:数据转换和处理的灵活能力

作者&#xff1a;木则 阿里云 EventBridge 提供了强大而灵活的事件总线服务&#xff0c;它可以连接应用程序、阿里云云服务和阿里云 Serverless 服务来快速构建 EDA&#xff08;Event-driven Architectures&#xff09;事件驱动架构&#xff0c;驱动应用与应用&#xff0c;应用…

Prometheus插件安装kafka_exporter

下载地址 https://github.com/danielqsj/kafka_exporter/releases 解压 tar -zxvf kafka_exporter-1.7.0.linux-amd64.tar.gzmv kafka_exporter-1.7.0.linux-amd64 kafka_exporter服务配置 cd /usr/lib/systemd/systemvi kafka_exporter.service内容如下 [Unit] Descript…

Go语言学习笔记:基础语法和类型

Go语言学习笔记&#xff1a;基础语法和类型 目录 Go语言学习笔记&#xff1a;基础语法和类型学习路线前言变量声明常量数据类型布尔型&#xff08;Boolean&#xff09;整型&#xff08;Integer&#xff09;浮点型&#xff08;Floating point&#xff09;复数型&#xff08;Comp…

42 漏洞发现-操作系统之漏洞探针类型利用修复

目录 系统漏洞发现意义?漏洞类型危害情况?如何做好未卜先知?相关名词解释:漏洞扫描工具演示-Goby&#xff0c;Nmap&#xff0c;Nessus(操作)漏洞类型区分讲解-权限提升,远程执行等(思路)漏洞利用框架演示-Metasploit,Searchsploit等(操作)漏洞修复方案讲解说明-补丁,防护软件…

Android.mk和Android.bp的区别和转换详解

Android.mk和Android.bp的区别和转换详解 文章目录 Android.mk和Android.bp的区别和转换详解一、前言二、Android.mk和Android.bp的联系三、Android.mk和Android.bp的区别1、语法&#xff1a;2、灵活性&#xff1a;3、版本兼容性&#xff1a;4、向后兼容性&#xff1a;5、编译区…

深度学习(5)---自注意力机制

文章目录 1. 输入与输出2. Self-attention2.1 介绍2.2 运作过程2.3 矩阵相乘理解运作过程 3. 位置编码4. Truncated Self-attention4.1 概述4.2 和CNN对比4.3 和RNN对比 1. 输入与输出 1. 一般情况下在简单模型中我们输入一个向量&#xff0c;输出结果可能是一个数值或者一个类…

基于springboot+vue新能源汽车充电管理系统

摘要 新能源汽车充电管理系统是基于Spring Boot和Vue.js技术栈构建的一款先进而高效的系统&#xff0c;旨在满足不断增长的新能源汽车市场对充电服务的需求。该系统通过整合前后端技术&#xff0c;实现了用户注册、充电桩管理、充电订单管理等核心功能&#xff0c;为用户提供便…

【linux基础】linux root用户密码忘记解决方式

方式一&#xff1a;进入单用户模式 1.开启虚拟机的时候&#xff0c;按下“e”健进入用户引导界面 2.再按下“e”&#xff0c;进入内核的编辑 3.找到kernel开头的选项&#xff0c;再次按下“e” 4. 输入 5. 按下“b”&#xff0c;启动 6. 启动后&#xff0c;输入passwd&#xf…

ubuntu使用docker compose一键部署项目

1、将前面手动部署的容器和镜像全部删除 docker rmi hmall (hmall镜像名) docker rmi image_id rmi 是删除多个 rm是删除一个 2、执行命令 docker compose up -d http://192.168.79.129:18080/search.html 访问安装成功&#xff01; 该ip是虚拟机ubuntu的ip 3、docker-compos…

Docker 配置 Gitea + Drone 搭建 CI/CD 平台

Docker 配置 Gitea Drone 搭建 CI/CD 平台 配置 Gitea 服务器来管理项目版本 本文的IP地址是为了方便理解随便打的&#xff0c;不要乱点 首先使用 docker 搭建 Gitea 服务器&#xff0c;用于管理代码版本&#xff0c;数据库选择mysql Gitea 服务器的 docker-compose.yml 配…

赛氪受邀参加安徽省翻译协会2023年年会

安徽省翻译协会于近日在合肥成功举办2023年年会暨学术研讨会。本次会议旨在服务党和国家工作大局&#xff0c;广泛汇聚翻译界力量&#xff0c;推动翻译行业高质量发展&#xff0c;同时总结一年来我省翻译界成果&#xff0c;谋划明年工作。 安徽省翻译协会2023年年会暨学术研讨会…