[数据结构] 线性表和顺序表

目录

 线性表

顺序表的实现

顺序表各个方法的实现

boolean isFull() -- 判断数组是否放满 :

void add(int data) -- 在数组末尾插入新元素 : 

void add(int pos,int data) -- 在指定位置插入元素 : 

boolean contain(int toFind) -- 判断是否包含某个元素

int indexOf(int toFind) -- 查找某个对应元素的位置

int get(int pos) -- 获取pos位置的元素

void set(int pos,int value) -- 将pos位置的元素设为value

void remove (int toRemove)——删除第一次出现的关键字

void removeAll (int toRemove)——删除所有出现的关键字

void clear ()——清空顺序表


 线性表

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

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

 

顺序表的实现

1. 创建一个IList 接口, 用来放所有相关方法

public interface IList {boolean isFull(); // 判断数组是否放满void add(int data); // 在数组末尾新增元素void add(int pos,int data); // 给指定位置插入数据boolean contain(int toFind); // 判断是否包含某个元素int indexOf(int toFind); // 查找某个对应元素的位置int get(int pos); // 获取pos位置的元素void set(int pos,int value);// 将pos位置的元素设为valuevoid remove(int toRemove); // 删除第一次出现的关键字void removeAll(int roRemove); // 删除所有出现的关键字void clear(); // 清空顺序表
}

2.创建一个MyArrayList 类, 数组成员变量 int[] elem 用来放数据, 整形成员变量usedSize 用来记录数组里面的数据个数

3.在 MyArrayList 类里面实现IList 接口, 并重写里面的方法

顺序表各个方法的实现

boolean isFull() -- 判断数组是否放满 :

直接返回usedSize == elem.length 即可,相等为true, 不等为false

public boolean isFull() {return size == elem.length;}

void add(int data) -- 在数组末尾插入新元素 : 

1.先用isFull()方法判断数组是否放满,若装满,就调用Arrays的copyOf(elem,2*elem.length)方法对数组进行扩容

2.将第usedSize位的数组元素赋值为data

3.usedSize++

public void add(int data) {if(isFull()) {elem = Arrays.copyOf(elem,elem.length * 2); // 如果满了就扩容为原来的两倍}elem[size] = data;size++;}

void add(int pos,int data) -- 在指定位置插入元素 : 

1.首先判断传入的参数pos是否合法:

                1).创建一个checkPosOfAdd(int pos)方法来进行判断

                2).若(pos < 0 || pos >= usedSize) ,则抛出一个自定义异常 PosNotLegalException

2.再用isFull()方法判断数组是否装满,若装满,调用Arrays的copyOf(elem,2*elem.length)方法对数组进行扩容

3.移动元素,将后面的元素从后往前依次向后移动一位elem[usedSize] = elem[usedSize - 1]

4.插入元素,elem[pos] = data

5.usedSize++

public void add(int pos, int data) {// 判断pos是否合法try {checkAddPos(pos);} catch (PosNotLegalException e) {e.printStackTrace();}// 判断数组是否放满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++;}

void checkAddPos(int pos) -- 检查传入add方法中的pos是否合法 : 

                若不合法则抛出一个自定义异常 PosNotLegalException

private void checkAddPos(int pos) {if(pos < 0 || pos >= usedSize) {throw new PosNotLegalException("pos位置不合法");}}

PosNotLegalException -- 传入参数不合法的自定义异常

                继承自运行时异常 RuntimeException

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

boolean contain(int toFind) -- 判断是否包含某个元素

1.遍历数组

2.当elem[i] == toFind 时, return true;

3.找不到,return false

public boolean contain(int toFind) {for (int i = 0;i < usedSize;i++) {if(elem[i] == toFind) {return true;}}return false;}

int indexOf(int toFind) -- 查找某个对应元素的位置

1.遍历数组

2.当elem[i] == toFind 时, return i;

3.找不到 return -1;

public int indexOf(int toFind) {for (int i = 0;i < usedSize;i++) {if(elem[i] == toFind) {return i;}}return -1;}

int get(int pos) -- 获取pos位置的元素

1.判断传入的参数pos是否合法

        1)创建 checkPosOfGetAndSet(int pos) 方法来进行判断

        2)若 (pos < 0 || pos >= usedSize) , 则抛出自定义异常 PosNotLegalException

2.合法, return elem[pos]

public int get(int pos) {try {checkPosOfGetAndSet(pos);} catch (PosNotLegalException e) {e.printStackTrace();}return elem[pos];}private void checkPosOfGetAndSet(int pos) {if(pos < 0 || pos >= usedSize) {throw new PosNotLegalException("pos位置不合法");}}

void set(int pos,int value) -- 将pos位置的元素设为value

1. 判断传入的参数pos是否合法

        1).调用checkPosOfGetAndSet(int pos) 方法来判断

        2).若 (pos < 0 || pos >= usedSize) , 则抛出自定义异常 PosNotLegalException

2.赋值: elem[pos] == value;

@Overridepublic void set(int pos, int value) {try {checkPosOfGetAndSet(pos);} catch (PosNotLegalException e) {e.printStackTrace();}elem[pos] = value;}
private void checkPosOfGetAndSet(int pos) {if(pos < 0 || pos >= usedSize) {throw new PosNotLegalException("pos位置不合法");}}

void remove (int toRemove)——删除第一次出现的关键字

1.调用 indexOf() 方法,获取关键字的下标,并对下标进行判断,若 pos == -1,则输出“未找到

2. 移动元素,将后面的元素从后往前依次向后移一位 elem[pos] = elem[pos + 1];

3.usedSize--;

public void remove(int toRemove) {int pos = indexOf(toRemove);if(pos == -1) {System.out.println("没有要找的关键字");return;}for(int i = pos;i < usedSize-1;i++) {elem[i] = elem[i+1];}usedSize--;}

void removeAll (int toRemove)——删除所有出现的关键字

  1. 使用 for 循环多次调用 indexOf() 方法,若 pos != -1,则继续操作
  2. 移动元素,将后面的元素从后往前依次向后移一位 `elem[pos] = elem[pos + 1];
  3. usedSize--;
public void removeAll(int toRemove) {for(int i = 0;i < usedSize;) {int pos = indexOf(toRemove);if(pos != -1) {for(int j = pos;j < usedSize - 1;j++) {elem[j] = elem[j+1];}usedSize--;} else {break;}}}

void clear ()——清空顺序表

  • 因为是基本类型,直接 usedSize = 0 即可
  • 若是引用类型,则需将每一个位置的数据都置为 null (防止内存泄露)
public void clear() {usedSize = 0;}

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

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

相关文章

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…

导入了fastjson2的依赖,但却无法使用相关API的解决方案

今天遇到了一个特别奇怪的问题&#xff0c;跟着视频敲代码&#xff0c;视频中用到了一个将JSON字符串转为对象的 API&#xff0c;需要引入alibaba的fastjson2相关依赖&#xff0c;我引入的依赖跟视频一样。 <!--视频中给的相关依赖 --> <dependency><groupId&g…

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外&#xff0c;还有一个小众的市场&#xff0c;那就是多媒体展厅场景&#xff0c;这个场景目前处于垄断地位的软件是HirenderS3&#xff0c;做的非常早而且非常全面&#xff0c;都是通用的需求&…

【漫话机器学习系列】070.汉明损失(Hamming Loss)

汉明损失&#xff08;Hamming Loss&#xff09; 汉明损失是多标签分类问题中的一种评价指标&#xff0c;用于衡量预测结果与实际标签之间的差异。它定义为预测错误的标签比例&#xff0c;即错误标签的个数占总标签数量的比值。 在多标签分类中&#xff0c;每个样本可以属于多…

Meta推动虚拟现实:Facebook如何进入元宇宙时代

随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;与增强现实&#xff08;AR&#xff09;技术的快速发展&#xff0c;世界正在逐步迈向一个全新的数字时代——元宇宙。而在这个革命性的转变中&#xff0c;Meta&#xff08;前身为Facebook&#xff09;作为全球…

C++ Primer 算术运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

【初阶数据结构和算法】八大排序算法之插入排序(直接插入排序、希尔排序及其对比)

文章目录 一、常见排序算法分类一、直接插入排序二、希尔排序三、直接插入排序和希尔排序性能对比 一、常见排序算法分类 常见的排序算法有八种&#xff0c;我们简单盘点一下 插入排序&#xff1a;直接插入排序、希尔排序选择排序&#xff1a;直接选择排序、堆排序交换排序&am…

大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》

论文链接&#xff1a;https://arxiv.org/abs/2402.06196 摘要&#xff1a;自2022年11月ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLMs&#xff09;因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样&#xff0c;大语言模型通过在大量文本数…

4种架构的定义和关联

文章目录 **1. 各架构的定义****业务架构&#xff08;Business Architecture&#xff09;****应用架构&#xff08;Application Architecture&#xff09;****数据架构&#xff08;Data Architecture&#xff09;****技术架构&#xff08;Technology Architecture&#xff09;*…

实时波形与频谱分析———傅立叶变换

实时波形与频谱分析&#xff1a;一个交互式动画演示 在信号处理领域&#xff0c;时域波形和频域频谱是理解信号特性的重要工具。通过时域波形&#xff0c;我们可以直观地观察信号随时间的变化&#xff0c;而频域频谱则揭示了信号中所包含的频率成分及其幅值。为了帮助大家更好…

数据结构:时间复杂度

文章目录 为什么需要时间复杂度分析&#xff1f;一、大O表示法&#xff1a;复杂度的语言1.1 什么是大O&#xff1f;1.2 常见复杂度速查表 二、实战分析&#xff1a;解剖C语言代码2.1 循环结构的三重境界单层循环&#xff1a;线性时间双重循环&#xff1a;平方时间动态边界循环&…

基于Springboot+vue的租车网站系统

基于SpringbootVue的租车网站系统是一个现代化的在线租车平台&#xff0c;它结合了Springboot的后端开发能力和Vue的前端交互优势&#xff0c;为用户和汽车租赁公司提供了一个高效、便捷、易用的租车体验和管理工具。以下是对该系统的详细介绍&#xff1a; 一、系统架构 后…

[x86 ubuntu22.04]进入S4失败

目录 1 问题描述 2 解决过程 2.1 查看内核日志 2.2 新建一个交换分区 2.3 指定交换分区的位置 1 问题描述 CPU&#xff1a;G6900E OS&#xff1a;ubuntu22.04 Kernel&#xff1a;6.8.0-49-generic 使用“echo disk > /sys/power/state”命令进入 S4&#xff0c;但是无法…

Java 大视界 -- Java 大数据在智慧文旅中的应用与体验优化(74)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

使用Python和TensorFlow/Keras构建一个简单的CNN模型来识别手写数字

一个简单的图像识别项目代码示例,使用Python和TensorFlow/Keras库来训练一个基本的CNN模型,用于识别MNIST手写数字数据集,并将测试结果输出到HTML。 代码运行效果截图: 具体操作步骤: 1. 安装所需的库 首先,确保你已经安装了所需的Python库: pip install tensorflow…

Redis --- 使用zset处理排行榜和计数问题

在处理计数业务时&#xff0c;我们一般会使用一个数据结构&#xff0c;既是集合又可以保证唯一性&#xff0c;所以我们会选择Redis中的set集合&#xff1a; 业务逻辑&#xff1a; 用户点击点赞按钮&#xff0c;需要再set集合内判断是否已点赞&#xff0c;未点赞则需要将点赞数1…

kamailio-osp模块

该文档详细讲解了如何在Kamailio中配置和使用OSP模块&#xff08;Open Settlement Protocol Module&#xff09;&#xff0c;以实现基于ETSI标准的安全多边对等互联&#xff08;Secure Multi-Lateral Peering&#xff09;。以下是核心内容的总结&#xff1a; 1. 模块功能 OSP模…

北大AGI与具身智能评估新范式!Tong测试:基于动态具身物理和社会互动的评估标准

作者&#xff1a;Yujia Peng, Jiaheng Han, Zhenliang Zhang, Lifeng Fan, Tengyu Liu, Siyuan Qi, Xue Feng, Yuxi Ma, Yizhou Wang, Song-Chun Zhu 单位&#xff1a;北京通用人工智能研究院国家通用人工智能重点实验室&#xff0c;北京大学人工智能研究所&#xff0c;北京大…

开发板上Qt运行的环境变量的三条设置语句的详解

在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量&#xff1a; export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…

一文讲解Spring如何解决循环依赖

Spring 通过三级缓存机制来解决循环依赖&#xff1a; 一级缓存&#xff1a;存放完全初始化好的单例 Bean。 二级缓存&#xff1a;存放正在创建但未完全初始化的 Bean 实例。 三级缓存&#xff1a;存放 Bean 工厂对象&#xff0c;用于提前暴露 Bean。 试问:三级缓存解决循环依…