数据结构:图文详解顺序表的各种操作(新增元素,查找元素,删除元素,给指定位置元素赋值)

目录
一.顺序表的概念
二.顺序表的实现
新增元素
默认尾部新增
指定位置添加元素
查找元素
查找是否存在
查找元素对应的位置
查找指定位置对应的元素
删除元素
获取顺序表长度
清空顺序表
一.顺序表的概念
在线性数据结构中,我们一般分为俩类:顺序表和链表

顺序表是一种线性数据结构,是数据元素按照线性顺序存储的数据结构,通常使用数组实现。顺序表中的元素以一定的顺序排列,每个元素都可以通过下标来进行访问。顺序表支持随机访问,可以快速地访问任意一个元素,但插入或删除元素时需要移动其余元素,效率较低。顺序表在内存中是一个连续的存储区域,数据元素紧密相邻存储,因此随机访问速度快。由于顺序表容量固定,当元素数量超过容量时需要重新分配内存空间,这可能会导致操作的耗时和内存使用的增加。
二.顺序表的实现
顺序表是一种数据结构,他和语言语法无关,语言只是通过不同的方式去描述这个数据结构,
举个通俗的例子说,假如湖面上有一座假山,而湖边有一群游客
有的人用英语说 “There is a rockery on the lake”
有的人用中文说 “湖面上有一坐假山”
有的人用日语说 “湖面に築山があります”
而这座假山就像是我们的数据结构,而我们使用的英语,中文,日语则是我们不同的编程语言。因此在学习数据结构的过程中,我们不必刻意去在意使用的什么语言什么语法,我们需要了解的是这个数据结构的本质和功能以及特性。笔者这里以Java作为顺序表的载体进行分享。
我们通常使用数值去实现顺序表,对于一个顺序表,它至少应该有以下俩个成员变量
- 数组:用来存放数据和元素
- 数组内存放的元素的个数:记录数组内元素的个数可以方便我们更好的进行增加删除等操作
public class MyArrayList{public int[] arr;//存放数据的数组public int usedSize;//记录数组内元素的个数
}
对于一个顺序表,它应该实现以下这些功能,我们将这些顺序表特有的功能和特性抽象出来一个接口,然后自己用代码去实现一个正真的顺序表。
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();
}
新增元素
我们将新增元素分为俩种方式:默认尾部新增元素以及指定位置新增元素
默认尾部新增
在刚开始的时候,数组大小为我们设置的默认大小5,数组内部是没有元素的,也就是说默认的元素数量也是0,我们可以直接新增元素;但是数组的内容是有限的,当数组内容放满了后就需要扩容了,我们使用copyOf直接将原有数组的大小扩大一倍,再让这个数组重新接收扩容后的数组。
再来到具体的新增元素部分,usedSize相当于一直在记录顺序表最后一个元素,直接对当前顺序表最后一个位置放入数据data,并且记录元素的数量加一。
public static final int DEFAULT_SIZE = 5;// 新增元素,默认在数组最后新增public void add(int data) {//判断满了之后要扩容if (arr.length == usedSize) {arr = Arrays.copyOf(arr, DEFAULT_SIZE * 2);}arr[usedSize] = data;usedSize++;}
指定位置添加元素
在添加之前先对要添加的位置进行判断,在顺序表中除了第一个节点之外每一个节点都有它的前驱,所以我们要确保添加的位置在序列中,如果不在序列中,我们就抛出一个自定义异常(这一步不是必须的)
在确定了输入的位置是合法的后,还要先判断顺序表是否已满,如果满了就进行扩容,在剩余空间充足的情况下就进行添加操作,在添加的时候需要进行元素的移动来为新的元素腾出位置,之后再在空出的位置上放入我们想要放入的元素,当我们完成新增后,记录元素个数的usedSize自然也要加一
、
代码实现:
private void cheakPos(int pos) {if (pos < 0 || pos > usedSize)throw new ExceptionOfPos("pos位置不能为:" + pos);} public void add(int pos, int data) {cheakPos(pos);//判断满了之后要扩容if (arr.length == usedSize) {arr = Arrays.copyOf(arr, DEFAULT_SIZE * 2);}//移动元素留出空位for (int i = usedSize - 1; i >= pos; i--) {arr[i + 1] = arr[i];}arr[pos] = arr[pos - 1];//给pos位置元素赋值arr[pos - 1] = data;usedSize++;}
public class ExceptionOfPos extends RuntimeException{public ExceptionOfPos(String message) {super(message);}
}
查找元素
查找可以按查找结果分为
- 查找是否存在
- 查找元素对应的位置
- 查找指定位置对应的元素
查找是否存在
查找是相当最好实现的,因为我们并没有对顺序表进行内容上的改变,这也是顺序表最大的优势。查找只需要挨个遍历,看看是否有我们要找的元素,如果有就返回存在(true),如果没有就返回不存在(false)
// 判定是否包含某个元素public boolean contains(int toFind) {for (int i = 0; i < usedSize; i++) {if (arr[i] == toFind)return true;}return false;}
查找元素对应的位置
挨个遍历,看看是否有我们要找的元素,如果有就返回元素的下标,如果没有就返回-1
// 查找某个元素对应的位置public int indexOf(int toFind) {for (int i = 0; i < usedSize; i++) {if (arr[i] == toFind)return i + 1;}return -1;}
查找指定位置对应的元素
在判定输入位置和顺序表的合法性后(不一定非要抛出异常,笔者这里只是给个思路),直接返回目标位置的元素就可以了
// 获取 pos 位置的元素public int get(int pos) {//检查输入位置是否合法cheakPos(pos);//检查顺序表是否为空cheakEmpty();return arr[pos];}private void cheakPos(int pos) {if (pos < 0 || pos > usedSize)throw new ExceptionOfPos("pos位置不能为:" + pos);}private void cheakEmpty() {if (usedSize == 0)throw new ExceptionOfEmpty("当前顺序表为空,无法操作");}
删除元素
删除之前得先判断顺序表是否为空,在不为空的情况下,我们利用刚才写的查找方法indexOf找到要删除的元素的位置,然后将元素从后往前依次覆盖就可以了,因为最后一个元素的后面是没有元素的,所以我们要进行手动覆盖,元素减少之后,对应的记录数量的usedSize也得减一

//删除第一次出现的关键字keypublic void remove(int toRemove) {//检查顺序表是否为空cheakEmpty();int delPos = indexOf(toRemove);for (int i = delPos; i < usedSize; i++) {arr[i-1] = arr[i];}arr[usedSize-1] = arr[usedSize];usedSize--;}
获取顺序表长度
因为usedSize保存了顺序表元素的个数,也就是顺序表的长度,所以在判断顺序表非空后直接返回usedSize就可以
// 获取顺序表长度public int size() {//检查顺序表是否为空cheakEmpty();return usedSize;}
清空顺序表
直接将元素的个数置为0,其余的方法就无法通过usedSize去操作顺序表了,也就完成了顺序表的清空
// 清空顺序表public void clear() {usedSize = 0;}
本次的分享就到此为止了,希望我的分享能给您带来帮助,也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!
如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!
有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见![]()
相关文章:
数据结构:图文详解顺序表的各种操作(新增元素,查找元素,删除元素,给指定位置元素赋值)
目录 一.顺序表的概念 二.顺序表的实现 新增元素 默认尾部新增 指定位置添加元素 查找元素 查找是否存在 查找元素对应的位置 查找指定位置对应的元素 删除元素 获取顺序表长度 清空顺序表 一.顺序表的概念 在线性数据结构中,我们一般分为俩类…...
2023 年 IntelliJ IDEA下载、安装教程,附详细图文
大家好,今天为大家带来的是 2023年 IntelliJ IDEA 下载、安装教程,超详细的图文教程,亲测可用。 文章目录 1 IDEA 下载2 IDEA 安装3 IDEA 使用4 快捷键新手必须掌握:Ctrl:Alt:Shift:Ctrl Alt&a…...
C++——解锁string常用接口
目录 string::npos; 1.测试string容量相关的接口: 1.1 string::size() 1.2 string::clear() 1.3 string::resize() 1.4 string::erase() 1.5 string::reserve() 保留 1.6 std::string::shrink_to_fit 2.string数据插入删除相关的接口 2.1 std::string::pus…...
Stable Video Diffusion(SVD)参数使用教程
Stable Video Diffusion(SVD)安装和测试 官网 github | https://github.com/Stability-AI/generative-modelsHugging Face | https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xtPaper | https://stability.ai/research/stable-vid…...
【传智杯】排排队、小卡与质数 2、1024 程序员节发橙子题解
🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙请不要相信胜利就像山坡上的蒲公英一样唾手…...
Oracle
1.解释冷备份和热备份的不同点以及各自的优点 冷备份 发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法。适用于所有模式的数据库。 优点 是非常快速的备份方法(只需拷贝文件)容易归档(简单拷贝即可&a…...
2023年c语言程序设计大赛
7-1 这是一道送分题 为了让更多的同学参与程序设计中来,这里给同学们一个送分题,让各位感受一下程序设计的魅力,并祝贺各位同学在本次比赛中取得好成绩。 注:各位同学只需将输入样例里的代码复制到右侧编译器,然后直…...
9.vue3项目(九):spu管理页面的新增和修改
目录 一、SPU和SKU概念 二、SPU静态搭建 1.代码编辑 2.效果展示 三、封装接口以及出参入参...
人工智能:让生活更便捷、更智能——探讨人工智能在生活中的作用与挑战
文章目录 前言人工智能的定义与分类人工智能的领域一、智能语音助手改变日常生活二、智能驾驶带来出行革命三、人工智能在医疗健康领域的应用四、教育领域的人工智能创新 人工智能的应用生活方面的影响工作方面的影响 应对AI带来的挑战后记 前言 人工智能相关的领域࿰…...
【C++】类和对象——const修饰成员函数和取地址操作符重载
在上篇博客中,我们已经对于日期类有了较为全面的实现,但是,还有一个问题,比如说,我给一个const修饰的日期类的对象 这个对象是不能调用我们上篇博客写的函数的,因为&d1是const Date*类型的ÿ…...
express+mySql实现用户注册、登录和身份认证
expressmySql实现用户注册、登录和身份认证 注册 注册时需要对用户密码进行加密入库,提高账户的安全性。用户登录时再将密码以相同的方式进行加密,再与数据库中存储的密码进行比对,相同则表示登录成功。 安装加密依赖包bcryptjs cnpm insta…...
【PyTorch】(二)加载数据集
文章目录 1. 创建数据集1.1. 直接继承Dataset类1.2. 使用TensorDataset类 2. 加载数据集3. 将数据转移到GPU 1. 创建数据集 主要是将数据集读入内存,并用Dataset类封装。 1.1. 直接继承Dataset类 必须要重写__getitem__方法,用于根据索引获得相应样本…...
如何提高3D建模技能?
无论是制作影视动画还是视频游戏,提高3D建模技能对于你的工作都至关重要的。那么如何能创建出精美的3D模型呢?本文给大家一些3D建模技能方面的建议。 3D建模通过专门的软件完成,涉及制作三维对象。这项技能在视频游戏开发、建筑、动画和产品…...
【前端开发】Next.js与Nest.js之间的差异2023
在快节奏的网络开发领域,JavaScript已成为构建可靠且引人入胜的在线应用程序的标准语言。然而,随着对适应性强、高效的在线服务的需求不断增加,开发人员通常不得不从广泛的库和框架中进行选择,以满足其项目的要求。Next.js和Nest.…...
【CAN通信】CanIf模块详细介绍
目录 1.内容简介 2.CanIf详细设计 2.1 CanIf功能简介 2.2 一些关键概念 2.3依赖的上下层模块 2.4 功能详细设计 2.4.1 Hardware object handles 2.4.2 Static L-PDUs 2.4.3 Dynamic L-PDUs 2.4.4 Dynamic Transmit L-PDUs 2.4.5 Dynamic receive L-PDUs 2.4.6Physi…...
PS最新磨皮软件Portraiture4.1.2
Portraiture是一款好用的PS磨皮滤镜插件,拥有磨皮美白的功能,操作也很简单,一键点击即可实现美白效果,软件还保留了人物的皮肤质感让照片看起来更加真实。portraiture体积小巧,不会占用过多的电脑内存哦。 内置了多种…...
旋转框(obb)目标检测计算iou的方法
首先先定义一组多边形,这里的数据来自前后帧的检测结果 pre [[[860.0, 374.0], [823.38, 435.23], [716.38, 371.23], [753.0, 310.0]],[[829.0, 465.0], [826.22, 544.01], [684.0, 539.0], [686.78, 459.99]],[[885.72, 574.95], [891.0, 648.0], [725.0, 660.0]…...
render函数举例
在这段代码中,renderButton是一个对象吗 还有render为什么不能写成render() {} 代码原文链接 <template><div><renderButton /></div> </template><script setup> import { h, ref } from "vue"; const renderButt…...
微信小程序文件预览和下载-文件系统
文件预览和下载 在下载之前,我们得先调用接口获取文件下载的url 然后通过wx.downloadFile将下载文件资源到本地 wx.downloadFile({url: res.data.url,success: function (res) {console.log(数据,res);} })tempFilePath就是临时临时文件路径。 通过wx.openDocume…...
图解Redis适用场景
Redis以其速度而闻名。 1 业务数据缓存 1.1 通用数据缓存 string,int,list,map。Redis 最常见的用例是缓存对象以加速 Web 应用程序。 此用例中,Redis 将频繁请求的数据存储在内存。允许 Web 服务器快速返回频繁访问的数据。这…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
