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

数据结构--顺序表(详解)

                                         欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦·~

点击这里了解更多内容

目录

  • 一、线性表
  • 二、顺序表

一、线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

在这里插入图片描述

二、顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。
顺序表的实现:

1.定义一个接口,里面放着需要实现的方法:

public interface Ilist {// 新增元素,默认在数组最后新增public void add(int data);boolean isFull();// 在 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() ;
}

2.定义一个mySeqlist类去继承接口,然后对,每个方法进行重写。

public class mySeqlist implements Ilist{public final int DEFALUT_CAPTICY=10;public int[] array;//定义起始数组大小为10public mySeqlist() {this.array =new int[DEFALUT_CAPTICY];}//顺序表的元素个数public int usesize;// 新增元素,默认在数组最后新增@Overridepublic void add(int data) {}@Overridepublic boolean isFull() {return false;}@Overridepublic void add(int pos, int data) {}@Overridepublic boolean contains(int toFind) {return false;}@Overridepublic int indexOf(int toFind) {return 0;}@Overridepublic int get(int pos) {return 0;}@Overridepublic void set(int pos, int value) {}@Overridepublic void remove(int toRemove) {}@Overridepublic int size() {return 0;}@Overridepublic void clear() {}@Overridepublic void display() {}
}

接下来一个一个来实现这些方法,然后完成一个顺序表的实现。

打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的.

@Overridepublic void display() {for (int i = 0; i < usesize; i++) {System.out.print(array[i] + " ");}}

判断数组是否存储满了

@Overridepublic boolean isFull() {return this.usesize==array.length;}

数组存储满了,然后想插入数据就得进行扩容。


private int[] grow() {return this.array= Arrays.copyOf(this.array,2*this.array.length);}

新增元素,默认在数组最后新增

    @Overridepublic void add(int data) {//判断数组是否存储满了if(isFull()){//如果忙了就扩容grow();}array[usesize]=data;usesize++;}private int[] grow() {return this.array= Arrays.copyOf(this.array,2*this.array.length);}@Overridepublic boolean isFull() {return this.usesize==array.length;}

再生成一个test类,每写完一个方法,然后测试是否成功

public class Test {public static void main(String[] args) {mySeqlist mylist=new mySeqlist();//新增mylist.add(1);mylist.add(6);mylist.add(10);mylist.display();}
}

运行结果:
在这里插入图片描述


在 pos 位置新增元素
可以自定义一个异常,来判断输入的pos位置是否合法

public class posillegal extends RuntimeException{ public posillegal(){super();}public posillegal(String S){super(S);}
}

定义一个方法来判断pos是否合法

   private void Check(int pos) {if(pos<0||pos>usesize){throw new posillegal("pos位置不合法!!!");}}

在 pos 位置新增元素

   public void add(int pos, int data) {try{Check(pos);if(isFull()){//如果忙了就扩容grow();}for (int i = usesize; i >pos ; i--) {array[i]=array[i-1];}array[pos]=data;usesize++;}catch (posillegal e){e.printStackTrace();}}

测试:
在这里插入图片描述


点击这里了解什么是异常

判定是否包含某个元素
@Overridepublic boolean contains(int toFind) {//先判断数组是否为空if(isempty()){return false;}if(Find(toFind)){return true;}return false;}private boolean isempty() {return usesize==0;}private boolean Find(int tofind) {for (int i = 0; i < usesize; i++) {if(array[i]==tofind){return true;}}return false;}

在这里插入图片描述


获取值的下标

   @Overridepublic int indexOf(int toFind) {for (int i = 0; i < usesize; i++) {if(array[i]==toFind){return i;}}return -1;}

在这里插入图片描述


获取pos位置的值

@Overridepublic int get(int pos) {try{Check(pos);return array[pos];}catch (posillegal e){e.printStackTrace();}return  -1;}

在这里插入图片描述


把pos位置的元素设置变成value

  @Overridepublic void set(int pos, int value) {array[pos]=value;}

在这里插入图片描述


去除某个值

  @Overridepublic void remove(int toRemove) {if(isempty()){return;}int toremove=indexOf(toRemove);for (int i = toremove; i <usesize ; i++) {array[i]=array[i+1];}usesize--;}

在这里插入图片描述


求顺序表的长度

@Overridepublic int size() {return usesize;}

在这里插入图片描述


清空顺序表

   @Overridepublic void clear() {usesize=0;}

在这里插入图片描述


好了,到这里整个顺序表就差不多完成了。下面是完整代码:

Ilist 接口

public interface Ilist {// 新增元素,默认在数组最后新增public void add(int data);boolean isFull();// 在 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() ;
}

mySeqlist类

import java.util.Arrays;public class mySeqlist implements Ilist{public final int DEFALUT_CAPTICY=10;public int[] array;//定义起始数组大小为10public mySeqlist() {this.array =new int[DEFALUT_CAPTICY];}//顺序表的元素个数public int usesize;// 新增元素,默认在数组最后新增@Overridepublic void add(int data) {//判断数组是否存储满了if(isFull()){//如果忙了就扩容grow();}array[usesize]=data;usesize++;}private int[] grow() {return this.array= Arrays.copyOf(this.array,2*this.array.length);}@Overridepublic boolean isFull() {return this.usesize==array.length;}// 在 pos 位置新增元素@Overridepublic void add(int pos, int data) {try{Check(pos);if(isFull()){//如果忙了就扩容grow();}for (int i = usesize; i >pos ; i--) {array[i]=array[i-1];}array[pos]=data;usesize++;}catch (posillegal e){e.printStackTrace();}}private void Check(int pos) {if(pos<0||pos>usesize){throw new posillegal("pos位置不合法!!!");}}// 判定是否包含某个元素@Overridepublic boolean contains(int toFind) {//先判断数组是否为空if(isempty()){return false;}if(Find(toFind)){return true;}return false;}private boolean isempty() {return usesize==0;}private boolean Find(int tofind) {for (int i = 0; i < usesize; i++) {if(array[i]==tofind){return true;}}return false;}//获取值的下标@Overridepublic int indexOf(int toFind) {for (int i = 0; i < usesize; i++) {if(array[i]==toFind){return i;}}return -1;}//获取pos位置的值@Overridepublic int get(int pos) {try{Check(pos);return array[pos];}catch (posillegal e){e.printStackTrace();}return  -1;}//把pos位置的元素设置变成value@Overridepublic void set(int pos, int value) {array[pos]=value;}//去除某个值@Overridepublic void remove(int toRemove) {if(isempty()){return;}int toremove=indexOf(toRemove);for (int i = toremove; i <usesize ; i++) {array[i]=array[i+1];}usesize--;}//求顺序表的长度@Overridepublic int size() {return usesize;}//清空顺序表@Overridepublic void clear() {usesize=0;}//打印顺序表@Overridepublic void display() {for (int i = 0; i < usesize; i++) {System.out.print(array[i] + " ");}}
}

自定义 pos异常

public class posillegal extends RuntimeException{public posillegal(){super();}public posillegal(String S){super(S);}
}

测试类(测试仅供参考)

public class Test {public static void main(String[] args) {mySeqlist mylist=new mySeqlist();//新增mylist.add(1);mylist.add(6);mylist.add(10);mylist.add(2,8);mylist.display();System.out.println();//System.out.println(mylist.get(1));mylist.set(2,9);mylist.remove(6);mylist.display();System.out.println();System.out.println(mylist.size());mylist.clear();mylist.display();}
}

在这里插入图片描述
欧耶!!!我学会啦!!!

相关文章:

数据结构--顺序表(详解)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、线性表二、顺序表 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结…...

Day62 图论part11

Floyd 算法精讲 Floyd 算法代码很简单&#xff0c;但真正理解起原理 还是需要花点功夫&#xff0c;大家在看代码的时候&#xff0c;会发现 Floyd 的代码很简单&#xff0c;甚至看一眼就背下来了&#xff0c;但我为了讲清楚原理&#xff0c;本篇还是花了大篇幅来讲解。 代码随想…...

git clone 超时

git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…...

WPF编程excel表格操作

WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用&#xff0c;操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…...

Day10补代码随想录 理论基础|232.用栈实现队列|225.用队列实现栈|20.有效的括号|1047.删除字符串中的所有相邻重复项

栈和队列理论基础 抽象认识 栈是先进后出(FIFO)&#xff0c;队列是先进先出(LIFO) 队首(先进))队尾(后进)栈顶(后进)栈底(先进) 栈(Stack) 只在一端进行进出操作(只在一端进一端出)像个篮球框&#xff0c;取用篮球从一端进出。 /进栈 int a[1000];//足够大的栈空间 int top-1…...

【Devops】什么是Devops?(Development+Operations)和运维的区别?

DevOps&#xff08;Development Operations&#xff09;是一种将开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;团队结合在一起的文化和实践&#xff0c;目的是通过自动化、协作和持续反馈来加快软件的开发、部署和运维的周期&#xff0c;…...

基于NodeMCU的物联网电灯控制系统设计

最终效果 基于NodeMCU的物联网电灯控制系统设计 小程序关灯 上图展现了小程序关灯过程的数据传输过程&#xff1a;用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。 项目介绍 该项目是“物联网实验室监测控制系统设计&#xff08;…...

Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02

在嵌入式开发中&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种常用的串行通信协议&#xff0c;广泛应用于与外设&#xff08;如 EEPROM、传感器、显示屏等&#xff09;进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器&#xff0c;它提供 2Kbit…...

Linux应用软件编程-多任务处理(线程)

线程&#xff1a;轻量级的进程&#xff0c;线程的栈区独立&#xff08;8M&#xff09;&#xff0c;与同一进程中的其他线程共用进程的堆区&#xff0c;数据区&#xff0c;文本区。 进程是操作系统资源分配的最小单位&#xff1b;线程是cpu任务调度的最小单位。 1. 线程的创建…...

VITUREMEIG | AR眼镜 算力增程

根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示&#xff0c;美国市场AR/VR总出货量增长10.3%。其中&#xff0c;成立于2021年的VITURE增长速度令人惊艳&#xff0c;同比暴涨452.6%&#xff0c;成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…...

Jenkins管理多版本python环境

场景&#xff1a;项目有用到python3.8和3.9&#xff0c;python环境直接安装在jenkins容器内。 1、进入jenkins容器 docker exec -it jenkins /bin/bash 2、安装前置编译环境 # 提前安装&#xff0c;以便接下来的配置操作 apt-get -y install gcc automake autoconf libtool ma…...

Flutter富文本实现学习

Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件&#xff0c;而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能&#xff0c;比如在富文本…...

如何解决 OpenAI API 连接问题:降级 urllib3 版本

如何解决 OpenAI API 连接问题&#xff1a;降级 urllib3 版本 在使用 OpenAI API 时&#xff0c;很多开发者可能会遇到连接问题&#xff0c;特别是在使用 Python 代码与 OpenAI 进行交互时。常见的错误包括 ProxyError、SSLError 和 MaxRetryError&#xff0c;它们通常表示在通…...

【C语言】库函数常见的陷阱与缺陷(三):内存分配函数[4]--free

C语言中的free函数用于释放之前通过malloc、calloc或realloc动态分配的内存。然而,在使用free函数时,开发者可能会遇到一些陷阱和缺陷。 一、功能与用法 free 函数是 C 语言中用于释放动态分配内存的关键函数。在程序使用 malloc、calloc 或 realloc 等函数在堆上分配了内存…...

论文分享 | PromptFuzz:用于模糊测试驱动程序生成的提示模糊测试

大语言模型拥有的强大能力可以用来辅助多种工作&#xff0c;但如何有效的辅助仍然需要人的精巧设计。分享一篇发表于2024年CCS会议的论文PromptFuzz&#xff0c;它利用模型提示生成模糊测试驱动代码&#xff0c;并将代码片段嵌入到LLVM框架中执行模糊测试。 论文摘要 制作高质…...

AWS K8s 部署架构

Amazon Web Services&#xff08;AWS&#xff09;提供了一种简化的Kubernetes&#xff08;K8s&#xff09;部署架构&#xff0c;使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS&#xff08;Elastic Kubernetes Service&#xff09;&#xff0c;它是…...

JavaSE笔记(四)

Java泛型与集合类 在前面我们学习了最重要的类和对象,了解了面向对象编程的思想,注意,非常重要,面向对象是必须要深入理解和掌握的内容,不能草草结束。在本章节,我们会继续深入了解,从我们的泛型开始,再到我们的数据结构,最后再开始我们的集合类学习。 走进泛型 为…...

C语言基础——指针(5)

一&#xff0e; 函数指针变量 1. 函数指针变量的定义&#xff1a; 类比数组指针变量&#xff0c;数组指针变量是存放数组地址的变量&#xff0c;那么同理&#xff0c;函数指针变量就是存放函数地址的变量。 2. 创建函数指针变量&#xff1a; 函数是有地址的&#xff0…...

curl+openssl 踩坑笔记

curl编译&#xff1a;点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …...

Unity 实现Canvas显示3D物体

新建一个UI相机&#xff0c;选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体&#xff0c;并将3D物体的层级设置为UI层 适当的放缩3DObjParent&#xff0c;让3D物体能显示出来…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...