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

「数据结构」实现顺序表

🎇个人主页: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仓库了:
实现顺序表

相关文章:

  • Backtrader 文档学习-Slippage
  • 纯html+js+css个人博客
  • Python绘制对角矩阵代码分享
  • 05 MyBatis之表关系的声明+事务+SqlSession三件套的作用域
  • flask_django基于python的城市轨道交通公交线路查询系统vue
  • Vue3的v-model说明和使用方法
  • 故障诊断 | 一文解决,CNN卷积神经网络故障诊断(Matlab)
  • Java中如何详细的打印出具体报错的堆栈信息
  • 数据库管理-第141期 DG PDB - Oracle DB 23c(20240129)
  • 统计学-R语言-7.3
  • ABAP EXCEL 转 PDF
  • node.js基础--01
  • 用C#实现最小二乘法(用OxyPlot绘图)
  • 用Python库pillow处理图像
  • Linux操作系统权限相关问题(一站式速通权限)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • EventListener原理
  • 初识 webpack
  • 第2章 网络文档
  • 聊聊flink的TableFactory
  • 浏览器缓存机制分析
  • 模型微调
  • 前端面试之CSS3新特性
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Spring第一个helloWorld
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • # 透过事物看本质的能力怎么培养?
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)springcloud实战之config配置中心
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)Unity3DUnity3D在android下调试
  • .NET delegate 委托 、 Event 事件
  • .Net Redis的秒杀Dome和异步执行
  • .NET 事件模型教程(二)
  • .net 无限分类
  • @angular/cli项目构建--Dynamic.Form
  • @Transactional 详解
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C++] 多线程编程-thread::yield()-sleep_for()
  • [CDOJ 1343] 卿学姐失恋了
  • [CISCN2019 华东北赛区]Web2
  • [FZSZOJ 1223] 上海红茶馆
  • [Java] 模拟Jdk 以及 CGLib 代理原理
  • [LeetCode]-283. 移动零-1089. 复写零
  • [pasecactf_2019]flask_ssti proc ssti config
  • [Python设计模式] 第27章 正则表达式——解释器模式
  • [Qualcomm][GPIO]高通芯片引脚相关知识记录
  • [RoarCTF 2019]Easy Calc
  • [SP1043] GSS1 - Can you answer these queries I
  • [笔记] BAD PASSWORD ,linux 修改密码历程