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

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

顺序表是一种线性数据结构,是数据元素按照线性顺序存储的数据结构,通常使用数组实现。顺序表中的元素以一定的顺序排列,每个元素都可以通过下标来进行访问。顺序表支持随机访问,可以快速地访问任意一个元素,但插入或删除元素时需要移动其余元素,效率较低。顺序表在内存中是一个连续的存储区域,数据元素紧密相邻存储,因此随机访问速度快。由于顺序表容量固定,当元素数量超过容量时需要重新分配内存空间,这可能会导致操作的耗时和内存使用的增加。
二.顺序表的实现
顺序表是一种数据结构,他和语言语法无关,语言只是通过不同的方式去描述这个数据结构,
举个通俗的例子说,假如湖面上有一座假山,而湖边有一群游客
有的人用英语说 “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 服务器快速返回频繁访问的数据。这…...
抛开Transformer,我们还能如何理解Attention机制?
对于许多软件测试从业者而言,“Attention机制”这个词常常与Transformer、BERT、GPT这些大模型名词紧密捆绑,仿佛是深度学习“黑盒”中一个难以触及的复杂组件。然而,当我们暂时抛开Transformer这棵参天大树,回归到Attention机制本…...
MCP 实现深度技术报告
1. MCP 协议概述与架构定位 1.1 协议背景 Model Context Protocol (MCP) 是 Anthropic 推出的开放标准协议,旨在标准化 AI 助手与外部数据源、工具之间的集成方式。在 Claude Code 中,MCP 不仅是外部集成接口,更是核心架构组件,…...
FlowState Lab 日志分析与性能调优实战
FlowState Lab 日志分析与性能调优实战 1. 为什么需要关注模型服务性能 当你把FlowState Lab模型部署上线后,可能会遇到这样的情况:请求量一大,响应就开始变慢,甚至出现超时。这时候就需要关注服务的性能表现。性能调优不是玄学…...
intv_ai_mk11一文详解:7B参数轻量级开源对话模型在中小团队中的降本增效实践
intv_ai_mk11一文详解:7B参数轻量级开源对话模型在中小团队中的降本增效实践 1. 轻量级AI对话助手的价值定位 在中小团队的实际运营中,专业AI助手的引入往往面临两大难题:高昂的部署成本和复杂的技术门槛。intv_ai_mk11作为7B参数的轻量级开…...
不止是IDEA!手把手教你用同一个Docker Compose文件部署全家桶(PyCharm/GoLand/DataGrip)
云端开发革命:用Docker Compose统一部署JetBrains全系Web IDE 1. 为什么需要云端IDE全家桶? 记得去年接手一个跨语言项目时,我的本地开发环境简直成了灾难现场——同时开着PyCharm处理Python数据分析、GoLand编写微服务、DataGrip管理数据库&…...
港科夜闻 | 香港科大“长者护脑社区计划“为6,000名长者提供阿尔兹海默症早筛
关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科技大学3月23日宣布推出为期五年的 “长者护脑社区计划”。这项开创性计划以社区为本,旨在为香港基层长者提供阿尔兹海默症及轻度认知障碍的早期检测。香港科大将联同东华学院及十多间社福机构,…...
intv_ai_mk11应用场景:研发团队用其自动生成Git Commit Message规范模板
研发团队如何用intv_ai_mk11自动生成Git Commit Message规范模板 1. 研发团队的Commit Message痛点 每个研发团队都面临过这样的困境:代码提交信息五花八门,格式混乱。有的同事写"修复bug",有的写"改了东西"࿰…...
丹青幻境效果展示:宣纸底纹UI下生成图像与界面美学统一性视觉报告
丹青幻境效果展示:宣纸底纹UI下生成图像与界面美学统一性视觉报告 1. 设计理念与视觉定位 丹青幻境的设计理念源于传统东方美学与现代数字艺术的完美融合。这款基于Z-Image架构打造的数字艺术创作工具,彻底摒弃了传统AI工具冰冷的技术感,将…...
MiniCPM-V-2_6制造业:产线图识别+设备状态与维护提醒生成
MiniCPM-V-2_6制造业:产线图识别设备状态与维护提醒生成 1. 项目背景与价值 在现代制造业中,生产线的可视化监控和设备维护是保证生产效率和质量的关键环节。传统的人工巡检方式效率低下,容易遗漏细节,而且无法实时发现问题。Mi…...
短视频 SEO 推广与视频广告投放的区别是什么_短视频 SEO 优化需要结合网站整体 SEO 策略吗
短视频 SEO 推广与视频广告投放的区别是什么_短视频 SEO 优化需要结合网站整体 SEO 策略吗 在当前数字化营销的浪潮中,短视频平台和视频广告投放已经成为许多企业和创作者推广内容、吸引观众的重要手段。对于SEO策略的理解和应用却常常存在误解。今天,我…...
