【数据结构趣味多】顺序表基本操作实现(Java)

news2024/10/1 12:21:17

目录

顺序表

 1.定义顺序顺序表

 2.顺序表功能

3.函数实现(java实现)?

打印顺序表display()函数

新增元素函数add() (默认在数组最后新增)

在 pos 位置新增元素add()函数(与上方函数构成重载)

判定是否包含某个元素contains()函数

查找某个元素对应位置indexOf() 函数

获取pos位置的元素get()函数

将pos位置的元素更新为value set()函数

删除第一个关键字key remove()函数

获得顺序表的长度size()函数

清空顺序表clear()函数

4.程序实例运行


顺序表

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

 1.定义顺序顺序表

public class SeqList {

    public int[] elem;
    public int usedSize;//目前存储元素个数
    //默认容量
    private static final int DEFAULT_SIZE = 10;

    public SeqList() {
        this.elem = new int[DEFAULT_SIZE];
    }
}

         上方定义类SeqList即是顺序表,定义elem数组存储数据,定义usedSize表示当前数组中包含多少个元素,定义DEFAULT_SIZE值为了在构造方法中将顺序表初始化为DEFAULT_SIZE大小的数组。

 2.顺序表功能

    public void display() { }    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的   

    public void add(int data) { }    // 新增元素,默认在数组最后新增

    public void add(int pos, int data) { } // 在 pos 位置新增元素

    public boolean contains(int toValue) { return true; }    // 判定是否包含某个元素

    public int indexOf(int toValue) { return -1; }    // 查找某个元素对应的位置

    public int get(int pos) { return -1; }    // 获取 pos 位置的元素

    public void set(int pos, int value) { }    // 给 pos 位置的元素设为 value

    public void remove(int toRemove) { }    //删除第一次出现的关键字key

    public int size() { return 0; }    // 获取顺序表长度

    public void clear() { }    // 清空顺序表

 上面是顺序表当中常用的函数。

3.函数实现(java实现)?

打印顺序表display()函数

public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }

 代码解读:

        打印函数顾名思义就是将顺序表中所有的数据打印出来。打印完的标准就是将顺序表中的数组完全输出,因此用usedSize作为终止条件,

新增元素函数add() (默认在数组最后新增)

public void add(int data) {
        if (this.usedSize == elem.length) {
            this.elem = Arrays.copyOf(elem, elem.length * 2;
        }
        elem[usedSize] = data;
        usedSize++;
    }

代码解读:

        此函数是增加顺序表中元素的函数。增加元素时,有一点需要注意,你的顺序表是否含有空间放入新的元素。使用函数isFull()判断,若没有满就正常增加,若已满,先对顺序表扩容,再进行增加。

        如何判断顺序表满没满?当数组的长度等于数组中包含元素就为满。

        当数据载入顺序表成功后,数组中包含元素个数usedSize就需要加1。

在 pos 位置新增元素add()函数(与上方函数构成重载)

public void add(int pos, int data) {
        if (pos < 0 || pos > usedSize) {
            throw new ArrayIndexException("下标非法,请检查");
        }
        if (this.usedSize == elem.length) {
            this.elem = Arrays.copyOf(elem, elem.length * 2;
        }
        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i + 1] = elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }

代码解读:

        我们要判断传过来的下标的合法性;分析pos的取值范围:我们要把新增函数放到现在已有元素之间,因此我们可以知道,pos的范围应该是 0<=pos<usedSize.若给定的下标不合法,我们就抛出一个异常,让程序停下来。

        再者这个函数功能也是添加,因此我们也需要判断顺序表空间的问题。

        若我们插入的位置已有元素,我们需把从pos位置的元素向后移,为data数据挪开位置。

        当数据载入顺序表成功后,数组中包含元素个数usedSize就需要加1。

判定是否包含某个元素contains()函数

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

代码解读:

        拿到需要找的数据toValue,遍历数组,将数组中的所有值与toValue进行比较,若数组中的值有与toValue相等,那么就返回true,否则返回false。

查找某个元素对应位置indexOf() 函数

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

代码解读:

         同上方思想一致,拿到需要找的数据toValue,遍历数组,将数组中的所有值与toValue进行比较,若数组中的值有与toValue相等,那么就返回下标i,否则返回-1。

获取pos位置的元素get()函数

public int get(int pos) {
        if(pos<0||pos>=usedSize){
            throw new ArrayIndexException("下标非法,请查看!");
        }
        return elem[pos];
    }

代码解读:

        我们要判断下标是否合法,我们需要顺序表中的元素,因此pos不能超过顺序表中第一个元素的下标和最后一个元素的下标,即下标是0<=pos<usedSize,如果不在这个范围内,我们抛出一个异常,让程序停下来。

将pos位置的元素更新为value set()函数

public void set(int pos, int value) {
        if(pos<0||pos>=usedSize){
            throw new ArrayIndexException("下标错误,请查看!");
        }
        elem[pos] = value;
    }

 代码解读:

        同上方一样,我们要判断下标是否合法,我们需要顺序表中的元素,因此pos不能超过顺序表中第一个元素的下标和最后一个元素的下标,即下标是0<=pos<usedSize,如果不在这个范围内,我们抛出一个异常,让程序停下来。

        最后将value赋到pos位置

删除第一个关键字key remove()函数

public boolean remove(int key) {
        int index = indexOf(key);
        if (index == -1) {
            System.out.println("没有这个数据");
            return false;
        }
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] = elem[i + 1];
        }
        usedSize--;
        elem[usedSize] = 0;
        return true;
    }

 代码解读:

        我们先调用indexOf()函数,判断顺序表中是否有我们删除的值,若有找到这个值的下标,没有就返回false。有就以覆盖的方式,将index下标的元素用他后一个元素覆盖,一直往复到最后一个元素,因为删除了一个元素,因此将使用大小usedSize减一,因为在覆盖时,最后一个后面没有元素了,因此没有覆盖,我们将他置为0。

获得顺序表的长度size()函数

public int size() {
        return usedSize;
    }

代码解读:

        当前数组中包含多少个元素,顺序表就是多长,因此顺序表的长度就是usedSize的大小。

清空顺序表clear()函数

public void clear() {
        usedSize = 0;
    }

 代码解读:

        因为所有的函数都是围绕这usedSisz进行构造的,我们只需将usedSize置为0,其他函数就无法进行运行(此处并非范例)

 其中异常的定义:

package SeqList;

public class ArrayIndexException extends RuntimeException{


        public ArrayIndexException() {
        }

        public ArrayIndexException(String message) {
            super(message);
        }
}

4.程序实例运行

package SeqList;

import java.awt.*;

public class test {
    public static void main(String[] args) {
        SeqList seqList =new SeqList();
        //添加数据
        seqList.add(1);
        seqList.add(2);
        seqList.add(3);
        seqList.add(4);
        seqList.add(5);
        //打印
        System.out.print("当前数组元素:");
        seqList.display();
        //值所在的下标
        System.out.print("值所在的下标:");
        System.out.println(seqList.indexOf(3));
        //是否包含这个值
        System.out.print("是否包含这个值:");
        System.out.println(seqList.contains(2));
        //获得下标所在位置元素
        System.out.print("获得下标所在位置元素:");
        System.out.println(seqList.get(3));
        //修改下标的值
        System.out.print("修改下标的值:");
        seqList.set(3,12);
        seqList.display();
        //删除关键字key
        System.out.print("删除关键字key:");
        seqList.remove(2);
        seqList.display();
        //获得长度
        System.out.print("获得当前顺序表长度:");
        System.out.println(seqList.size());
    }
}

 上方实例运行结果如下:

 

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

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

相关文章

XctNet:从单个X射线图像重建体积图像的网络

摘要 传统的计算机断层扫描&#xff08;CT&#xff09;通过使用不同角度的X射线投影计算逆氡变换来生成体积图像&#xff0c;这导致高剂量辐射、长重建时间和伪影。生物学上&#xff0c;可以利用先前的知识或经验在一定程度上从2D图像中识别体积信息。提出了一种深度学习网络Xc…

为什么要使用 kafka,为什么要使用消息队列?

总结以下两点&#xff1a; 1、缓冲和削峰&#xff1a; 上游数据时有突发流量&#xff0c;下游可能扛不住&#xff0c;或者下游没有⾜够多的机器来保证冗余&#xff0c;kafka在中间可以起到⼀个缓冲的作⽤&#xff0c;把消息暂存在kafka中&#xff0c;下游服务就可以按照⾃⼰的节…

B. Moderate Modular Mode(nmodx=ymodn )

Problem - 1603B - Codeforces 帮助他找到一个整数n&#xff0c;使得1≤n≤2⋅1018&#xff0c;并且nmodxymodn。这里&#xff0c;amodb表示a除以b后的余数。如果有多个这样的整数&#xff0c;请输出任何一个。可以证明&#xff0c;在给定的约束条件下&#xff0c;这样的整数总…

图的关键路径(含多支交叉路径分离输出)

文章目录关键路径的理解关键路径求解的图解与分析关键路径查找的代码实现多支交叉路径的分离输出总结此文代码均可在Windows与Linux操作系统下的常用编译器上运行&#xff0c;例如&#xff1a;vs、vscode、Dev-C等等。关键路径的理解 图的关键路径一般是在求从一个顶点到另一个…

RocketMQ-RocketMQ部署(Linux、docker)

文章目录一、Linux1、单机部署RocketMQ> 前置条件第一步、官网下载 并 上传至服务器第二步、配置jdk环境第三步、修改初始内存第四步、启动 NameServer第五步、启动 Broker第六步、关闭RocketMQDemo&#xff1a;发送与接收消息测试 (Linux端)2、部署可视化管理工具—rocketm…

tictoc 例子理解 13-15

tictoc13-tictoc13 子类化cMessage生成消息&#xff0c;随机目标地址tictoc 14 在13的基础上增加两变量显示于仿真界面tictoc 15 模型数据输出为直方图tictoc13 子类化cMessage生成消息&#xff0c;随机目标地址 在这一步中&#xff0c;目标地址不再是节点2——我们绘制了一个…

[附源码]计算机毕业设计springboot现代诗歌交流平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MySQL存储过程

目录 存储过程 1、存储过程的概念 2、存储过程的优点 3、创建存储过程 格式&#xff1a; 4、调用存储过程 格式 5、查看存储过程 格式&#xff1a; 6、存储过程的参数 7、删除存储过程 格式&#xff1a; 8、存储过程的控制语句 准备a表 &#xff08;1&#xff09;条…

Spring基础篇:注入

第一章&#xff1a;注入 一&#xff1a;什么是注入 &#xff08;Injection&#xff09;注入就是通过Spring的工厂类和spring的配置文件&#xff0c;对spring所创建的对象进行赋值&#xff0c;为成员变量进行赋值 二&#xff1a;为什么注入 为什么需要Spring工厂创建对象的时…

[附源码]Python计算机毕业设计SSM开放式在线课程教学与辅助平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计JAVA校园闲置物品租赁系统

[附源码]计算机毕业设计JAVA校园闲置物品租赁系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Maven使用指南(超详细)

Maven高级 目标 理解并实现分模块开发能够使用聚合工程快速构建项目能够使用继承简化项目配置能够根据需求配置生成、开发、测试环境&#xff0c;并在各个环境间切换运行了解Maven的私服 1&#xff0c;分模块开发 1.1 分模块开发设计 (1)按照功能拆分 我们现在的项目都是在…

Delay Penalty for RNN-T and CTC

1. 背景 之前介绍了如何在 RNN-T 流式模型上应用时延正则&#xff0c;以及在 Conformer 和 LSTM 上的实验结果。 本期公众号重点带大家回顾下具体的思路&#xff0c;以及如何类似地在 CTC 流式模型上应用时延正则。 有些内容可能有所重复&#xff0c;读者可适当跳过。2. Dela…

iwebsec靶场 SQL注入漏洞通关笔记12-等价函数替换绕过

系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入&#xff08;宽字节注入&#xff09;_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记3- bool注入&#xff08;布尔型盲注&#…

Ajax学习:同源策略(与跨域相关)ajax默认遵循同源策略

同源策略&#xff1a;是浏览器的一种安全策略 同源意味着&#xff1a;协议、域名、端口号必须相同 违背同源便是跨域 当前网页的url和ajax请求的目标资源的url必须协议、域名、端口号必须相同 比如&#xff1a;当前网页&#xff1a;协议http 域名 a.com 端口号8000 目标请求…

python——spark入门

Hadoop是对大数据集进行分布式计算的标准工具&#xff0c;这也是为什么当你穿过机场时能看到”大数据(Big Data)”广告的原因。它已经成为大数据的操作系统&#xff0c;提供了包括工具和技巧在内的丰富生态系统&#xff0c;允许使用相对便宜的商业硬件集群进行超级计算机级别的…

Android Poco初始化时,不大起眼但可能存在坑点的参数们

1. 前言 进行Android poco初始化的时候&#xff0c;可能大多数同学都是直接在Poco辅助窗里选择Android模式&#xff0c;然后选择自动帮我们补充poco的初始化脚本&#xff1a; 这种情况下&#xff0c;我们大多数都不会关注初始化的参数。但如果我们不了解这些参数的含义&#x…

Spring之@RequestMapping、@GetMapping、 @PostMapping 三者的区别

我的理解&#xff1a;其实RequestMapping、GetMapping、 PostMapping 三者就是父类和子类的区别&#xff0c;RequestMapping是父类&#xff0c;GetMapping、 PostMapping为子类集成了RequestMapping更明确了http请求的类型 分析三者的源码&#xff1a; RequestMapping .class&…

C#教务管理大数据平台系统源码

校务管理系统是专门针对幼儿园、培训学校的业务应用而设计研发的一款行业应用软件。校管家校务管理系统融入先进的协同管理理念&#xff0c;运用领先的信息化、网络化处理技术&#xff0c;结合丰富的教育培训行业经验&#xff0c;切实有效的解决幼儿园、培训学校日常工作中的关…

[附源码]计算机毕业设计-菜篮子系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…