顺序表详解(Java)

目录

顺序表

初始化

方法实现

1> display 遍历(简单)

2> isFull 是否为满

3> size 顺序表的大小

 4> add 增加在最后位置(考虑是否满了) (难)

5> add 增加到指定位置(是否为满)

6> isEmpty 是否为空

7> contain  是否包含某个元素 (简单)

8> indexOf 查找某个位置的元素 

 9> get 获取 pos 位置的元素

10> set 给 pos 位置的元素设为 value 

11> remove 移除某个数据

12> clear 清空顺序表

如何使用

小结


线性表定义: 

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

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

顺序表

顺序表是一个动态扩容的数组.

我们来实现一个顺序表, 需要通过这个数组写一些方法实现各种功能.

初始化

先来给顺序表创建一个数组.

    public static final int DEFAULT_SIZE = 10;public int[] elem;public int usedSize = 0;public MyArrayList() {this.elem = new int[DEFAULT_SIZE];}

 分配一个数组, usedSize 表示这个数组初始时里面0个数据, DEFAULT_SIZE 表示数组默认大小为10.我们也可以自己创建顺序表时来指定数组的默认大小, 通过构造函数传参来实现.

    public MyArrayList(int size) {this.elem = new int[size];}

方法实现

如何实现各种功能, 先来实现一个接口, 通过这个接口来说明我们想要实现的功能:

package myList;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();
}

然后写一个类来实现其中的代码:

package myList;public class MyArrayList implements IList{public static final int DEFAULT_SIZE = 10;public int[] elem;public int usedSize = 0;public MyArrayList() {this.elem = new int[DEFAULT_SIZE];}public MyArrayList(int size) {this.elem = new int[size];}@Overridepublic void add(int data) {}@Overridepublic void add(int pos, int data) {}@Overridepublic boolean contains(int toFind) {return false;}@Overridepublic int indexOf(int toFind) {return 0;}@Overridepublic int get(int pos) {return 0;}@Overridepublic void set(int pos, int value) {}@Overridepublic void remove(int toRemove) {}@Overridepublic int size() {return 0;}@Overridepublic void clear() {}@Overridepublic void display() {}@Overridepublic boolean isFull() {return false;}@Overridepublic boolean isEmpty() {return false;}
}

1> display 遍历(简单)

    @Overridepublic void display() {for(int i = 0; i < this.usedSize; i++) {System.out.println(this.elem[i]+ " ");}System.out.println();}

2> isFull 是否为满

    @Overridepublic boolean isFull() {return this.usedSize == elem.length;}

3> size 顺序表的大小

    @Overridepublic int size() {return this.usedSize;}

 4> add 增加在最后位置(考虑是否满了) ()

注意: 满了就扩容: 怎么扩容? 使用 copyOf 方法.

    @Overridepublic void add(int data) {if(isFull()) {elem = Arrays.copyOf(elem, 2*elem.length);}this.elem[this.usedSize] = data;usedSize++;}

5> add 增加到指定位置(是否为满)

注意: 看放的位置是否合法, 不能是负数或者太靠后不连贯了.

解决方法: 写一个方法来检查位置是否合法, 不合法的话抛出异常

此处的异常是自定义异常

package myList;public class PosIllegality extends Exception {public PosIllegality(String msg) {super(msg);}
}
    private void checkPosOnAdd(int pos) throws PosIllegality {if(pos < 0 || pos > usedSize) {System.out.println("位置不合法");throw new PosIllegality("插入元素下标异常: " + pos);}}

代码实现:  

    @Overridepublic void add(int pos, int data) {try {checkPosOnAdd(pos);}catch (PosIllegality e) {e.printStackTrace();return;}if(isFull()) {elem = Arrays.copyOf(elem, 2*elem.length);}for (int i = usedSize-1; i >= pos; i--) {elem[i+1] = elem[i];}elem[pos] = data;usedSize++;}

步骤:

1> 检查位置合法性

2> 检查是否数组满了

3> 开始进行位移: 从最后一个有效的数据开始往后移动, 当i< pos 时结束, 存放元素到 pos位置, usedSize++

6> isEmpty 是否为空

    @Overridepublic boolean isEmpty() {return this.usedSize == 0;}

7> contain  是否包含某个元素 (简单)

注意: 看是否为空

    @Overridepublic boolean contains(int toFind) {if(isEmpty()) {return false;}for(int i = 0; i < this.usedSize; i++) {if(toFind == elem[i]) {return true;}}return false;}

8> indexOf 查找某个位置的元素 

注意: 看是否为空

    @Overridepublic int indexOf(int toFind) {if(isEmpty()) {return -1;}for(int i = 0; i < this.usedSize; i++) {if(toFind == elem[i]) {return i;}}return -1;}

9> get 获取 pos 位置的元素

注意: 判断位置是否合法, 其中的异常是自定义异常

package myList;public class MyArrayListEmpty extends Exception {public MyArrayListEmpty(String msg) {super(msg);}
}
package myList;public class PosIllegality extends Exception {public PosIllegality(String msg) {super(msg);}
}

    @Overridepublic int get(int pos) throws MyArrayListEmpty {try {checkPosOnGet(pos);}catch (PosIllegality e) {e.printStackTrace();return -1;}if(isEmpty()) {throw new MyArrayListEmpty("获取指定下标元素时, 顺序表为空!");}return elem[pos];}private void checkPosOnGet(int pos) throws PosIllegality {if(pos < 0 || pos > usedSize) {System.out.println("不合法");throw new PosIllegality("获取指定下标的元素异常: " + pos);}}

10> set 给 pos 位置的元素设为 value 

注意:  pos 位置是否合法

package myList;public class PosIllegality extends Exception {public PosIllegality(String msg) {super(msg);}
}
    @Overridepublic void set(int pos, int value) {try {checkPosOnSet(pos);} catch (PosIllegality e) {throw new RuntimeException(e);}elem[pos] = value;}private void checkPosOnSet(int pos) throws PosIllegality {if(pos < 0 || pos > usedSize) {System.out.println("不合法");throw new PosIllegality("获取指定下标的元素异常: " + pos);}}

11> remove 移除某个数据

注意: 看是否有这个数据.没有的话可以抛出异常.有的话就依次覆盖前一个数据

    @Overridepublic void remove(int toRemove) {int index = indexOf(toRemove);if(index == -1) {System.out.println("没有找到这个数字!");return ;}for(int i = index; i < this.usedSize-1; i++) {elem[i] = elem[i+1];}usedSize--;}

12> clear 清空顺序表

最简单的一种方式

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

当里面的数据时引用数据类型时需要释放内存

    @Overridepublic void clear() {for (int i = 0; i < usedSize; i++) {elem[i] = null;}this.usedSize = 0;}

如何使用

可以通过 main 函数调用这个类中方法

package myList;/*** 类的使用者*/
public class Test {public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.display();}
}

小结

当添加元素或者删除元素时 注意: usedSize++ 或者 usedSize--

加入和删除 注意实现的过程.

注意下标不合法等异常

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

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

相关文章

Spring Boot 3.x使用knife4j

Spring Boot 3.x使用knife4j 1.添加knife4j依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version> </dependency>2.在…

【Unity Shader入门精要 第9章】更复杂的光照(四)

1. 透明度测试物体的阴影 对于物体有片元丢弃的情况&#xff0c;比如透明度测试或者后边会讲到的消融效果&#xff0c;使用默认的 ShadowCaster Pass 会产生问题&#xff0c;这是因为该Pass在生成阴影映射纹理时&#xff0c;没有考虑被丢弃的片元&#xff0c;而是使用完整的模…

建投数据收获客户感谢信

建投数据自2021年提出“以数据为核心的智能科技服务商”&#xff0c;并一直在为“成为国内领先的数字化转型合作伙伴”而努力&#xff0c;在赋能行业客户创造更大价值的同时&#xff0c;也陆续收到来自客户的肯定。 建投数据始终践行“成就客户&#xff0c;创新为要&#xff0…

【网络协议】【OSI】一次HTTP请求OSI工作过程详细解析

目录 1. 一次HTTP请求OSI工作过程 1.1 应用层&#xff08;第7层&#xff09; 1.2 表示层&#xff08;第6层&#xff09; 1.3 会话层&#xff08;第5层&#xff09; 1.4 传输层&#xff08;第4层&#xff09; 1.5 网络层&#xff08;第3层&#xff09; 1.6 数据链路层&am…

移除链表元素-力扣

一道基础的链表相关题目&#xff0c;在删除时对头节点进行单独处理。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

【vue部署】Apache部署vue项目

Apache部署vue项目 Apache 下载安装(windows)1. 下载2. 安装3. 启动服务 vue 部署配置1. 基础配置2. 解决页面刷新问题 Apache 下载安装(windows) 1. 下载 Apache 2.4.59 下载地址&#xff1a;httpd-2.4.59-240404-win64-VS17.zip Visual C Redistributable for Visual Studi…

Go语言通过goroutine实现多协程文件上传

文章推荐 1 作为程序员&#xff0c;开发用过最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;帮助你提高写代码效率 5 Jetbrains的a…

AWS EC2 连接 AWS RDS(Mysql)

1 创建RDS数据库 点击创建数据库 引擎选项 模板 设置 连接 2 EC2连接Mysql $ sudo yum list mariadb* Installed Packages mariadb-connector-c.x86_64 3.1.13-1.amzn2023.0.3 amazonl…

swig4.2.1压缩包中里面没有找到swig.exe

官网&#xff1a;Simplified Wrapper and Interface Generator C转 C# 采用Swig.exe 打开Example示例的解决方案&#xff1a;sln 生成 即可查看如何调用和使用.i文件 但是&#xff1a;迅雷不管下载哪个版本都是没有exe 官网说了自带。很迷很迷~ 下载其他版本的时候发现&…

TikTok矩阵管理系统:品牌增长的新引擎

随着社交媒体的快速发展&#xff0c;TikTok已成为全球最受欢迎的短视频平台之一。品牌和企业纷纷涌入这个平台&#xff0c;寻求新的增长机会。然而&#xff0c;随着内容的激增和用户群体的多样化&#xff0c;管理TikTok账号变得越来越复杂。这时&#xff0c;TikTok矩阵管理系统…

使用第三方的PyCharm开发工具

目录 PyCharm下载 PyCharm安装 运行PyCharm 创建工程目录 编写“hello world”程序 在同一个工程下创建多个程序文件 运行程序的多种方法 保存程序 关闭程序或工程 删除程序 打开最近的工程 调试断点 熟悉PyCharm开发环境 设置Python解析器 输出彩色控制台文字及…

50道题目!Python、SQL数据库、AB测试、业务分析、机器学习都在这里了!

介绍 每日一题系列已经更新了50道题目啦&#xff01; 题目难度为初级到中级&#xff0c;涵盖了Python、SQL数据库、AB测试、业务分析、机器学习五大主题&#xff0c;适合初学者和有一定基础的朋友。 原文链接: 50道题目&#xff01;Python、SQL数据库、AB测试、业务分析、机器…

pycharm 关闭项目卡死

PyCharm2023.3.4 关闭一直卡在 closing projects 解决办法&#xff1a; 打开PyCharm&#xff0c; 选择 Help -> Find Action -> 输入 Registry -> 禁用ide.await.scope.completion

10G SFP双口万兆以太网控制器,高速光口网络接口卡

2-Port 10G SFP NIC 是一款高速网 络接口卡&#xff0c;采用了 PCI Express 3.0 x8 接口&#xff0c;支持双 端口万兆以太网&#xff0c;具有高性能、高可靠性、低功耗等 优点&#xff0c;是数据中心、云计算、虚拟化等领域的理想选 择。 支持多种网络协议&#xff0c;如 …

【加密与解密(第四版)】第十六章笔记

第十六章 脱壳技术 16.1 基础知识 壳的加载过程&#xff1a;保存入口参数、获取壳本身需要使用的API地址、解密原程序各个区块的数据、IAT的初始化、重定位项的处理、HOOK API、跳转到程序原入口点 手动脱壳步骤&#xff1a;查找真正的入口点、抓取内存映像文件、重建PE文件&…

深度学习之基于Pytorch框架新冠肺炎CT图像分类

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着新冠肺炎&#xff08;COVID-19&#xff09;的全球爆发&#xff0c;快速、准确地诊断疾病成…

MySQL 日志有了解?binlog、redolog、undolog 分别有什么作 用、有什么区别?

MySQL 是一款流行的关系型数据库&#xff0c;其日志是其关键功能之一。MySQL 包括三种类型的日志&#xff0c;分别是binlog、 redolog 和 undolog&#xff0c;它们分别有不同的作用和特点。 binlog &#xff0c;binlog(Binary log)是 MySQL 中的二进制日志文件&#xff0c;用于…

Python筑基之旅-MySQL数据库(二)

目录 一、第三方库 1、mysql-connector-python 1-1、由来 1-2、优缺点 1-2-1、优点 1-2-1-1、官方支持 1-2-1-2、纯Python实现 1-2-1-3、全面支持 1-2-1-4、兼容性 1-2-1-5、易于使用 1-2-2、缺点 1-2-2-1、性能 1-2-2-2、安装 1-2-2-3、社区支持 1-2-2-4、扩…

Android-虚拟定位

使用虚拟定位软件模拟位置即可 链接: https://pan.baidu.com/s/1JyoGkxB97YyZSDH_yAzKPQ?pwd9cbw 提取码: 9cbw 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦

1020. 飞地的数量

1020. 飞地的数量 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;_1020飞地的数量_dfs_定义方向_1020飞地的数量_bfs_定义方向 错误经验吸取 原题链接&#xff1a; 1020. 飞地的数量 https://leetcode.cn/problems/number-of-enclaves/…