「数据结构」实现顺序表

🎇个人主页:Ice_Sugar_7
🎇所属专栏:Java数据结构
🎇欢迎点赞收藏加关注哦!

实现顺序表

  • 🍉前言
  • 🍉整体框架
  • 🍉添加元素
    • 🍌尾插
    • 🍌任意位置插入
  • 🍉其他方法

🍉前言

之前我们在C语言阶段已经详细介绍过如何实现一个顺序表,而现在我们采用OOP实现又会有哪些区别呢?一起来看看吧!

附:之前的C语言实现顺序表的博客链接
C语言实现顺序表


🍉整体框架

  • 顺序表是一个类,它的成员变量(字段)是一个数组和size
  • 在字段那里,数组我们只给声明,没有分配空间。数组对象是在构造方法里面创建的,创建的同时给一个默认的大小,这里设为10,后续有需要的话再扩容
public class MyArrayList{public int[] elem;//有效元素个数public int size;//数组默认大小private static final int DEFAULT_SIZE = 10;public MyArrayList() {this.elem = new int[DEFAULT_SIZE];}
}

然后顺序表需要实现各种方法,我们可以用一个接口来封装这些方法,只需让MyArrayList类实现这个接口就ok了。接口命名为IList
在IList中,我们要实现这些方法:

public interface IList {public void display();// 新增元素,默认在数组最后新增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);/*** 删除第一次出现的关键字key* @param key*/public void remove(int key);//删除所有值为key的元素public void removeAll(int key);// 获取顺序表长度public int size();// 清空顺序表public void clear();
}

🍉添加元素

🍌尾插

首先需要检查顺序表是否已经满了,如果满了就要扩容,这里我们要用copyof方法扩容

    private boolean isFull() {return this.size == elem.length;}private void checkCapacity() {if(isFull()) {elem = Arrays.copyOf(elem,elem.length*2);  //容量扩大到原来的两倍}}
  • 两个方法都用private修饰是因为我们不用把它们设计为接口(使用接口的人用不着检查容量、扩容,他们只需用你实现好的接口)
  • 这两个方法可以合并为一个方法
    public void add(int data) throws ListIsFullException{//判断顺序表是否满了,如果满了,就要扩容if(isFull()) {elem = Arrays.copyOf(elem,elem.length*2);}elem[size++] = data;  //注意放入元素之后size要+1}

🍌任意位置插入

和尾插略有区别,这个需要先检查插入的下标是否合法,如果是非法下标,那我们需要抛出异常

    //在指定下标插入元素时判断下标是否合法private boolean checkPosInAdd(int pos) {if(pos < 0 || pos > size)return false;return true;}

抛出异常我们需要自定义一个异常类,命名为IllegalPosException。它属于运行时异常,所以要继承RuntimeException

public class IllegalPosException extends RuntimeException{public IllegalPosException(String message) {super(message);}
}
    //在获取pos处的元素或者设定pos处元素的值时,检查下标是否合法
//这个方法和尾插检查下标的那个方法的区别在于:这个是不可以取到size处的元素public boolean checkPosInGetAndSet(int pos) {if(pos < 0 || pos >= size)return false;return true;}//将pos下标处的值设为valuepublic void set(int pos, int value) {if(!checkPosInGetAndSet(pos)) {throw new IllegalPosException("非法下标!");}elem[pos] = value;}public void add(int pos, int data) throws IllegalPosException {if(!checkPosInAdd(pos)) {throw new IllegalPosException("非法下标!");}if(isFull()) {elem = Arrays.copyOf(elem,elem.length*2);}//从pos下标开始的元素往后挪for(int i = size -1;i>=pos;i--) {//elem[i+1] = elem[i];set(i+1,elem[i]);}set(pos,data);++size;}

🍉其他方法

把添加元素的方法写完后,剩下方法的实现就是洒洒水啦,在此不多赘述。源码已经放在gitee仓库了:
实现顺序表

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

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

相关文章

IntersectionObserver、MutationObserver应用,监听项目中指定属性数据,点击或模块显示时

当项目中&#xff0c;需要获取某个页面上、某个标签上、有指定自定义属性时&#xff0c;需要在点击该元素时进行公共逻辑处理&#xff0c;或该元素在显示的时候进行逻辑处理&#xff0c;这时可以定义一个公共的方法&#xff0c;在每个页面引用&#xff0c;并写入数据即可 &…

自然语言处理的就业前景

国家发展大势所趋&#xff0c;促进各行各业智能化、数字化转型&#xff0c;而计算机自然语言处理是一个快速发展的领域&#xff0c;随着人工智能技术的不断发展和应用&#xff0c;对自然语言处理的需求也越来越大。因此&#xff0c;计算机自然语言处理的就业前景非常好。 在就业…

OSPF的优化

一&#xff1a;OSPF的优化&#xff1a;---lsa的优化 1、汇总 --- 减少骨干区域LSA更新量 2、特殊区域 --- 减少非骨干区域LSA更新量 二&#xff1a;汇总 1、区域汇总&#xff1a;OSPF的汇总被称为区域汇总 域间路由汇总---针对OSPF区域之间的路由进行汇总&#xff0c;针对…

【机器学习300问】21、什么是激活函数?常见激活函数都有哪些?

在我写的上一篇文章中介绍了感知机&#xff08;单个神经元&#xff09;的构成&#xff0c;其中就谈到了神经元会计算传送过来的信号的总和&#xff0c;只有当这个总和超过了某个界限值时&#xff0c;才会输出值。这也称为“神经元被激活”。如果想对神经网络是什么有更多了解的…

npm install 一直卡在 sill idealTree 解决方案

npm install 一直卡在 sill idealTree 解决方案 npm install安装vue项目的依赖时&#xff0c;执行 npm install 一直卡在 idealTree:xxx: sill idealTree buildDeps 。 解决方案&#xff1a; 设置淘宝源 npm config set registry https://registry.npm.taobao.org查看是否设置…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之DataPanel组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之DataPanel组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、DataPanel组件 数据面板组件&#xff0c;用于将多个数据占比情况使用占比图进…

集成学习之Boosting方法系列_XGboost

文章目录 【文章系列】【前言】【算法简介】【正文】&#xff08;一&#xff09;XGBoost前身&#xff1a;梯度提升树&#xff08;二&#xff09;XGBoost的特点&#xff08;三&#xff09;XGBoost实际操作1. 前期准备&#xff08;1&#xff09;数据格式&#xff08;2&#xff09…

小程序定制开发:解析定制化移动应用的未来

引言 在当今数字化时代&#xff0c;移动应用已经成为人们生活不可或缺的一部分。随着智能手机的普及&#xff0c;移动应用的需求呈现出爆发式增长&#xff0c;企业们也纷纷投身于这场数字化浪潮。然而&#xff0c;众多企业在竞争激烈的市场中&#xff0c;如何突显个性、提高用…

使用Eclipse搞Android项目报错

相信现在都没什么人还会用Eclipse来开发的了。 不过安装完后&#xff0c;打开Eclipse会提示我的Jdk版本不符合 --------------------------- Incompatible JVM --------------------------- Version 1.8.0_391 of the JVM is not suitable for this product. Version: 17 or g…

在 C# 中 checked 和 unchecked 关键字

在 C# 中&#xff0c;checked 和 unchecked 是用于控制整数运算溢出检查的关键字。它们允许我们明确指定在进行整数运算时是否要检查溢出&#xff0c;以及如何处理溢出情况。 默认情况下&#xff0c;C# 中的整数运算是未检查的&#xff0c;也就是说&#xff0c;当运算结果溢出…

实现sleep函数

作用&#xff1a;让线程休眠&#xff0c;等到指定时间在重新唤起。 基于Date实现&#xff1a; 以上的代码不会让线程休眠&#xff0c;而是通过高负荷计算使cpu无暇处理其他任务。缺点是在sleep的过程中其他所有的任务都会被暂停&#xff0c;包括dom的渲染。sleep的过程中程序会…

python之poetry模块,项目管理

一、简介 Poetry 是一个用于管理 Python 项目依赖关系和构建工具的工具。它提供了一个简单的命令行界面&#xff0c;可以帮助您创建、管理和发布 Python 项目&#xff0c;使用方法&#xff1a;command [options] [arguments] 官网&#xff1a;https://python-poetry.org/docs/…

书生浦语训练营笔记与作业汇总

课程笔记&#xff1a; 第一节&#xff1a;https://blog.csdn.net/qq_37397652/article/details/135532014第二节&#xff1a;https://blog.csdn.net/qq_37397652/article/details/135533226第三节&#xff1a;https://blog.csdn.net/qq_37397652/article/details/135586700第四…

Android --- Content Provider是使用示例,通俗易懂

当两个应用程序之间需要共享数据时&#xff0c;可以通过 Content Provider 来实现。在这个示例中&#xff0c;我们将创建一个简单的 Content Provider&#xff0c;让 App_B 暴露人口总数的数据&#xff0c;并由 App_A 来获取这个数据。 首先&#xff0c;我们来创建一个简单的示…

C++ 并发编程 | 线程池

文章目录 一、线程池 前言 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小&#xff0c;以默认的优先级运行&#xff0c;并处于多线程单元中。如果某个…

详解SpringCloud微服务技术栈:深入ElasticSearch(1)——数据聚合

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;ElasticSearch实战&#xff08;旅游类项目&#xff09; &#x1f4da;订阅专栏&#x…

软件设计不是CRUD(11):低耦合模块设计理论——业务抽象:规划模块分层

上一篇文章《软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度》本专题详细讲解了业务抽象的一个重要步骤:提取业务维度。本篇文章内容主要讲解在提取业务维度后,如何对应用程序中初步划分的各个功能模块进行分层规划。 1、为什么要进行模块分…

【lesson2】定长内存池的实现

文章目录 介绍定长内存池的设计定长内存池的实现需要成员变量需要的成员函数定长内存池结构定长内存池Delete&#xff08;释放空间&#xff09;的实现定长内存池New&#xff08;申请空间&#xff09;的实现 定长内存池的实现完整版 介绍 作为程序员(C/C)我们知道申请内存使用的…

Zookeeper实现分布式队列

目录 Zookeeper分布式队列 普通方式实现 设计思路 具体实现 使用Curator实现 具体实现 注意事项 Zookeeper分布式队列 常见的消息队列有:RabbitMQ&#xff0c;RocketMQ&#xff0c;Kafka等。Zookeeper作为一个分布式的小文件管理系统&#xff0c;同样能实现简单的队列功…

【python】图形化开发pyqt6基本写法模板与基础控件属性方法整理

pyqt6的简介 首先呢Python有许多可以编写图形化界面的库&#xff0c;我们通常跟着教程的话最初会接触的tkinter&#xff0c;但是学习中会发现编写的图形化跟我们平常接触的软件有很大区别&#xff08;简单来说就是丑&#xff09;。 pyqt则是第三方库&#xff0c;在Python中算…