Java数据结构篇——实现顺序表的增删查改

文章目录

    • 1.线性表
    • 2. 顺序表
      • 2.1 顺序表结构
      • 2.2 实现顺序表接口
      • 2.3 打印顺序表
      • 2.2 实现新增元素
      • 2.3 实现查找元素
      • 2.3 获取`pos`位置的值
      • 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 获取pos位置的值

思路:

  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.mzph.cn/news/220607.shtml

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

相关文章

大数据存储技术(1)—— Hadoop简介及安装配置

目录 一、Hadoop简介 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;Hadoop发展历史 &#xff08;三&#xff09;Hadoop三大发行版本 &#xff08;四&#xff09;Hadoop的优势 二、Hadoop的组成 &#xff08;一&#xff09;Hadoop1.x和Hadoop2.x的区别​…

SSL通配符详解

通配符证书是一种特殊的SSL/TLS证书&#xff0c;它允许一个域名及其所有子域名使用相同的证书。这意味着&#xff0c;如果您有一个通配符证书&#xff0c;您可以为该证书中的任何子域名提供SSL/TLS加密&#xff0c;而无需为每个子域名单独购买和配置证书。 通配符证书使用通配…

苹果电脑双开

1.第一步&#xff1a;在应用程序中找到微信 复制一个副本出来 2.第二步:打开复制的《微信副本》 右键打开 – 显示包内容 3.第三步:Contents - info.plist 后右键 打开方式 选择 文本编辑 4.第四步&#xff1a;找到查找和替换 这一段com.tencent.xinWeChat 后面是修改 com.tenc…

数据库性能优化八大方案

毫不夸张的说咱们后端工程师&#xff0c;无论在哪家公司&#xff0c;呆在哪个团队&#xff0c;做哪个系统&#xff0c;遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论&#xff0c;能让大家快速、准确的去选择出合适的优化方案&#xff0c;我相信…

MySQL系列(十):主从架构

一&#xff1a;主从架构 常见的主从架构模式有四种&#xff1a; 一主多从架构&#xff1a;适用于读大于写的场景&#xff0c;采用多个从库来分担数据库系统的读压力。多主架构&#xff1a;适用于读写参半的场景&#xff0c;采用多个主库来承载数据库系统整体的读写压力。多主…

可视化 Java 项目

有一定规模的 IT 公司&#xff0c;只要几年&#xff0c;必然存在大量的代码&#xff0c;比如腾讯&#xff0c;2019 年一年增加 12.9 亿行代码&#xff0c;现在只会更多。不管是对于公司&#xff0c;还是对于个人&#xff0c;怎么低成本的了解这些代码的对应业务&#xff0c;所提…

Spring Boot统一功能处理(Spring拦截器)

为什么需要Spring拦截器 原生的Spring AOP实现统一拦截有两大难点&#xff0c;1.定义拦截的规则难写&#xff1b;2.在切面类中拿到HttpSession比较难。为此Spring官方提供了拦截器帮我们解决了上面痛点。 实现登入信息验证拦截器 实现HanderInterceptor接口重写preHeadler方…

【LeetCode刷题】--172.阶乘后的零

172.阶乘后的零 方法&#xff1a; class Solution {public int trailingZeroes(int n) {int ans 0;for(int i 5;i<n;i5){for(int x i; x % 50; x/5){ans;}}return ans;} }进一步优化&#xff1a; class Solution {public int trailingZeroes(int n) {int ans 0;while (n…

【个人版】SpringBoot下Spring-Security核心概念解读【二】

Spring-Security HttpSecurity Spring-Security全局导读&#xff1a; 1、Security核心类设计 2、HttpSecurity结构和执行流程解读 3、Spring-Security个人落地篇 背景&#xff1a; Spring-Security框架的核心架构上一篇已经概述&#xff0c;展示其执行流程及逻辑&#xff0c;但…

【期末考复习向】transformer的运作机制

1.transformer的encoder运作 transformer的encoder部分包括了输入和处理2大部分。首先是输入部分inputs&#xff0c;这里初始的inputs是采用独热向量进行表示的&#xff0c;随后经过word2vec等操作把独热向量&#xff08;采用独热向量的好处就是可向量是正交的&#xff0c;可以…

re:Invent 产品体验分享:Amazon ElastiCache Serverless 缓存即时扩展功能与感受

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09;。 文章目录 前言产品介绍产品使用步骤1.创建缓存服务2.安全组开放访问权限…

C++从bing采集各行业的企业官网信息

作为一名合格的销售&#xff0c;除了自己的人脉&#xff0c;还应该有新鲜的客户加入并发掘。不管哪行哪业&#xff0c;知彼知己&#xff0c;方才能做到百战百胜。今天我就用我们的专业技能&#xff0c;让销售获取更多同行业的公开企业信息&#xff0c;让业绩顺风顺水。 通常在C…

如何实现电脑文件夹自动备份?以下是图解教程

在当今迅猛发展的科技时代&#xff0c;电脑已经成为不可或缺的办公工具。随着使用时间的增加&#xff0c;存储在电脑中的文件数量也逐渐增多。然而&#xff0c;由于设备故障、手动误删等原因&#xff0c;文件的丢失问题成为一个不可忽视的风险。如果丢失的文件具有重要性&#…

数学learning

目录 移动平均 简单移动平均 加权移动平均 指数移动平均 矩阵求导 矩阵对标量求导 Matrix-by-scalar 标量对矩阵求导 Scalar-by-matrix 参考博客 移动平均 优化算法里面会涉及到一个知识点&#xff1a;指数移动平均。 但是为了知识的完整性&#xff0c;这里会将常见的移动…

MCU平台下一种简单的文件系统设计构想

本文介绍MCU平台下一种简单的文件系统设计构想。 在使用MCU的项目中&#xff0c;经常会涉及到一些数据的存储&#xff0c;受限于硬件&#xff0c;又不太可能直接上文件系统&#xff08;如FAT文件系统&#xff09;&#xff0c;直接指定存储地址&#xff0c;数据长度对数据进行读…

React antd如何实现<Upload>组件上传附件再次上传已清除附件缓存问题

最近遇到一个React上传组件的问题&#xff0c;即上传附件成功后&#xff0c;文件展示处仍然还有之前上传附件的缓存信息&#xff0c;需要解决的问题是&#xff0c;要把上一次上传的附件缓存在上传成功或者取消后&#xff0c;可以进行清除 经过一顿试错&#xff0c;终于解决了这…

SE考研真题总结(二)

接上条&#xff0c;今天继续更新~ SE考研真题总结&#xff08;一&#xff09;-CSDN博客文章浏览阅读340次&#xff0c;点赞6次&#xff0c;收藏11次。本帖开始分享考研真题中设计【软件工程】的部分&#xff0c;预计会出5期左右&#xff0c;敬请期待~https://blog.csdn.net/js…

EasyRecovery(数据恢复软件) 2024中文绿色无需激活版下载

EasyRecovery是一款功能强大且专业的数据恢复软件&#xff0c;软件能够对电脑误删的文件进行恢复&#xff0c;包括格式化硬盘是数据恢复、手机U盘数据恢复等&#xff0c;小编今天给大家带来的是根据官软件解压后直接使用。感兴趣的朋友快来下载使用吧。 EasyRecovery-2024mac最…

Pytorch-CNN轴承故障一维信号分类(二)

目录 前言 1 数据集制作与加载 1.1 导入数据 1.2 数据加载&#xff0c;训练数据、测试数据分组&#xff0c;数据分batch 2 CNN-2D分类模型和训练、评估 2.1 定义CNN-2d分类模型 2.2 定义模型参数 2.3 模型结构 2.4 模型训练 2.5 模型评估 3 CNN-1D分类模型和训练、评…

flink找不到隐式项

增加 import org.apache.flink.streaming.api.scala._ 即可