【数据结构】Java实现顺序表

news2024/11/25 20:25:35

文章目录

  • 线性表
  • 顺序表
  • 顺序表的模拟实现
    • 1、新增元素,默认在数组最后新增
    • 2、判定是否包含某个元素
    • 3、查找某个元素对应的位置
    • 4、获取顺序表长度
    • 5、在 pos 位置新增元素
    • 6、获取 pos 位置的元素
    • 7、给 pos 位置的元素设为 value
    • 8、删除第一次出现的关键字key
    • 9、清除顺序表

线性表

什么是线性表呢?线性表是一种在实际中广泛运用的数据结构,例如:顺序表、链表、栈和队列。线性表在逻辑结构上是线性结构,就是一条线连续的,但是在物理结构上并不一定连续,今天我们要学习的顺序表就是线性结构的一种。

顺序表

顺序表名字听起来挺高大上的,但其实底层的逻辑就是一个数组,是用一段物理地址连续的存储单元依次存储数据结构元素的线性结构

顺序表的模拟实现

首先我们先来创建一个顺序表:

public class SeqList {
    private int[] array;//数组
    private int usedsize;//当前数组有多少个元素,初始为0
    
    private static int DEFAULT_SIZE = 5;
    // 默认构造方法
    public SeqList(){
        array = new int[DEFAULT_SIZE];//创建顺序表对象时创建一个5个元素的数组
    }
}

便于我们检测我们写的方法的正确性,我们可以写一个打印顺序表的方法。

 // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() {
        for(int i = 0;i < usedsize;i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

这样就可以遍历打印数组中的元素了,也就是遍历打印顺序表。

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

  //判断顺序表是否满
    private boolean isFullAdd(int[] array) {
        return usedsize == array.length;
    }

    // 新增元素,默认在数组最后新增
    public void add(int data) {
        //如果超过顺序表的最大容量需要先进行扩容
        if(isFullAdd(array)) {
            array = Arrays.copyOf(array,array.length * 2);
        }
        //如果没有超过直接在usedsize下标下添加元素
        array[usedsize] = data;
        usedsize++;
    }

我们需要向顺序表中添加元素,也就是向数组末尾添加元素,在添加之前我们首先要判断一下顺序表是否满了,如果满了我们需要进行扩容,之后将我们添加的数据添加到usedsize下标处就可以了。
我们在测试类里面测试一下我们的这个方法,成功将元素添加到了顺序表末尾并且打印出来,超出初始顺序表初始大小后会自动扩容。
在这里插入图片描述

2、判定是否包含某个元素

    public boolean contains(int toFind) {
        for(int i = 0;i < usedsize;i++) {
            if(array[i] == toFind) {
                return true;
            }
        }
        return false;
    }

遍历数组如果找到相同的元素就返回true,如果没有找到就返回false。
在这里插入图片描述

3、查找某个元素对应的位置

这个的思路跟判定是否包含某个元素是一样的,只不过这个方法返回的是对应元素的下标。

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

如果找到该元素就返回该元素的下标,没有找到就返回-1。
在这里插入图片描述

4、获取顺序表长度

这个方法我们直接返回usedsize就可以了:

  public int size() {
        return usedsize;
    }

在这里插入图片描述

5、在 pos 位置新增元素

pos位置新增元素时我们需要判断一下pos参数是否合法,数组的小标不可以小于0,并且顺序表中的元素必须挨在一起,所以pos也不可以大于usedsize,判断完pos参数还需要跟add方法一样判断顺序表是否已满,已满需要扩容。

  // 在 pos 位置新增元素
    public void add(int pos, int data) {
        //判断pos下标是否合法
        try {
            checkIndex(pos);
        }catch (IndexException ex) {
            ex.printStackTrace();
        }

        //如果超过顺序表的最大容量需要先进行扩容
        if(isFullAdd(array)) {
            array = Arrays.copyOf(array,array.length * 2);
        }

        for(int i = usedsize - 1;i >= pos;i--) {
            array[i + 1] = array[i];
        }
        
        array[pos] = data;
        usedsize++;

    }

    //判断add方法时的pos参数是否合法
    private void checkIndex (int pos ) throws IndexException{
        if(pos < 0 || pos > usedsize) {
            throw new IndexException("pos下标不合法");
        }
    }

 //判断顺序表是否满
    private boolean isFullAdd(int[] array) {
        return usedsize == array.length;
    }

当我们对于pos的合法性和顺序表是否已满进行判断完成后,我们需要的做的操作是,从数组的最后开始向后一次挪动数组元素,让数组元素向后挪动一位,直到找到pos位置,将pos位置上的元素向后移动一位后,将新增元素data放入pos位置。
在这里插入图片描述

在这里插入图片描述

6、获取 pos 位置的元素

同样我们需要对pos的合法性进行一下判断,跟在pos位置新增元素的区别是pos不可以等于usedsize,因为usedsize位置上并没有元素,会造成数组的越界访问。

 // 获取 pos 位置的元素
    public int get(int pos) {
        try{
            checkIndexGet(pos);
        }catch (IndexException ex) {
            ex.printStackTrace();
        }

        return array[pos];
    }

    //判断get时pos是否合法
    private void checkIndexGet(int pos) throws IndexException{
        if(pos < 0 || pos >= usedsize) {
            throw new IndexException("调用get方法时,pos不合法");
        }
    }

在这里插入图片描述

7、给 pos 位置的元素设为 value

同样我们还需要对参数pos进行合理性检查,之后将pos位置的元素替换为data

    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        try {
            checkIndex(pos);
        }catch (IndexException ex) {
            ex.printStackTrace();
        }

        array[pos] = value;
    }

在这里插入图片描述

8、删除第一次出现的关键字key

首先我们需要找到第一次出现关键字key的位置,可以通过之前写的indexOf方法找到,找到之后我们只需要将后面的数据向前挪动移动一个位置,就可以覆盖掉key元素。
在这里插入图片描述

  //删除第一次出现的关键字key
    public boolean remove(int toRemove) {
        int index = indexOf(toRemove);

        if(index == -1) {
            System.out.println("没有该元素");
            return false;
        }

        for(int i = index;i < usedsize -1;i++) {
            array[i] = array[i + 1];
        }
        usedsize--;
        array[usedsize] = 0;

        return true;
    }

在这里插入图片描述

9、清除顺序表

清空顺序表只需要将usedsize置为0就可以了。

 // 清空顺序表
    public void clear() { 
        usedsize = 0;
    }

在这里插入图片描述
以上我们就使用Java语言模拟实现了顺序表,模拟实现之后会帮助我们更好的理解顺序表,之后与大家分享顺序表的运用时大家会更容易理解。

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

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

相关文章

接口性能测试,这个还真有用啊。

目录&#xff1a;导读 一、概述 二、为什么要做接口压力测试 三、接口压力测试的局限性 四、谁来做接口压力测试 五、如何做接口压力测试 六、如何设计接口压力测试方案 七、压力测试报告应该包含哪些结果 八、如何解读压力测试的结果 九、如何根据测试结果定位性能问…

Pandas提取数据的几种方式

文章目录前言Pandas读取数据的几种方式1. read_csv2. read_excel3. read_sql总结前言 快期末了&#xff0c;数据挖掘的大作业需要用到python的相关知识&#xff08;这太难为我这个以前主学C的人了&#xff0c;不过没办法还是得学&#x1f602;&#xff09;&#xff0c;下面是我…

[附源码]计算机毕业设计Python的疫苗接种管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

算法刷题打卡第50天:排序数组---快速排序

排序数组 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5]快速排…

安科瑞霍尔闭环电流传感器在电动观光旅游车上的应用浅析

摘要&#xff1a; 本文介绍了基于霍尔闭环原理&#xff0c;即磁平衡式原理的电流传感器在电动观光旅游车上的使用方法&#xff0c;替代传统的霍尔器件&#xff0c;较好的解决了电动车行业现有霍尔传感器的基本问题&#xff0c;在稳定性上更加优越。 关键词&#xff1a;霍尔闭…

Linux----tr命令详细使用方法

【原文链接】Linux----tr命令详细使用方法 文章目录一、tr命令使用方法1.1 tr命令的作用1.2 tr命令格式1.3 tr命令常用的选项1.4 常用的匹配字符串二、tr命令常用实例2.1 如何查看文本中的控制字符2.2 将所有小写字母转换为大写字母2.3 将文件中的数字替换为&符号2.4 对命令…

android studio 升级 Dolphin | 2021.3.1 Patch 1 跟 View.isInEditMode,xml无法预览

最近一段时间Google又更新了AS的版本,一些小伙伴尝试了更新,发现在之前版本上好好的xml布局预览,在新版本上不显示了,新版本如下图所示。 一般来说出了新版本之后我们不会马上更新,因为会觉得新版本不稳定,问题多,但其实是问题不大,解决了就好了,那么我现在就遇到了一…

毕业设计 - 基于JSP的超市积分管理系统【源码 + 论文】

文章目录前言一、项目设计1. 模块设计系统功能需求管理员功能柜员功能2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 web项目: 基于JSP的超市积分管理系统 一、项目设计 1. 模块设计 系统功能需求 &#xff08;1&#xff09;柜员信息的管理&#xff1a;包括…

交换机端口震荡

交换机端口是支持网络连接和通信的物理网络组件。作为 IT 基础架构的关键部分&#xff0c;它们通过在 OSI 数据链路层转发和接收数据包来促进网络。它们还执行一些关键的网络功能&#xff0c;例如处理第 3 层数据包、创建和管理 VLAN、连接路由器、启用互联网连接等。因此&…

Arweave -- 永久性存储分享

Arweave Arweave 是一种新型存储&#xff0c;它支持具有可持续和永久的数据&#xff0c;允许用户和开发人员真正永久地存储数据 Arweave 项目&#xff0c;以前称为 Archain&#xff0c;正在创建一个与互联网平行的永久、去中心化和不可审查的信息档案。Arweave 的新颖“block…

技术分享 | 软件测试入门必会-流程管理平台

JIRA 是目前比较流行的测试流程管理系统&#xff0c;现在很多大厂使用的都是 JIRA。为什么大厂更爱用 JIRA 呢&#xff1f;其实就是因为它的定制性非常的强。可以自己定义流程&#xff0c;自己定义界面&#xff0c;自己定义字段。通过这些自定义的方式&#xff0c;就可以让整个…

特殊情况的高新技术企业成长性计算方法。

根据文件《高新技术企业认定管理工作指引》&#xff08;国科发火〔2016〕195号&#xff09;规定&#xff0c;选取企业净资产增长率、销售收入增长率等指标对企业成长性进行评价。企业实际经营期不满三年的按实际经营时间计算&#xff0c;计算方法如下&#xff1a; 成长性评分标…

【数据结构初阶】反转链表

文章目录问题描述&#xff1a;思路分析&#xff1a;代码展示&#xff1a;问题描述&#xff1a; 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据…

【计算机毕业设计】79.勤工助学管理系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着我国教育需求不断增加&#xff0c;高校教育资源有限&#xff0c;教育经费相对不足的情况下&#xff0c;利用现代信息技术发展高等教育&#xff0c;不仅充分利用了优秀的教育资源&#xff0c;而且为更多的…

迅为3A5000_7A2000开发板龙芯LoongArch架构

迅为3A5000_7A2000开发板龙芯LoongArch架构 主要参数 处理器: 龙芯3A5000 主频: 2.3GHz-2.5GHz 桥片: 7A2000 内存: 8GB、16GB DDR4带ECC纠错&#xff08;配置可选&#xff09; 系统: Loongnix 典型功耗: 35W 核心板: 16层 底板: 4层 核心板参数 尺寸: 125*95mm CPU: 龙芯…

J-004 Jetson电路设计之HDMI设计--NANO XAVIER NX

HDMI电路设计1 简介2 框图介绍3 原理图介绍1 简介 NANO & XAVIER NX提供一路HDMI接口&#xff0c;DP接口与HDMI是兼容的&#xff0c;可用于扩展一路HDMI。其中引脚说明: PIN名称描述方向类型63HDMI_DP_TXDN0DisplayPort 1 Lane 0 or HDMI Lane 2输出HDMI/DP65HDMI_DP_TXD…

高阶数据结构--图

本篇主要是介绍&#xff1a;图的一些常用的算法。 文章目录 一、图的基本概念二、图的存储结构 1、邻接矩阵2、邻接表三、图的遍历 1、广度优先遍历2、深度优先遍历四、最小生成树 1、Kruskal算法2、Prim算法五、最短路径 1、单源最短路径--Dijkstra算法2、单源最短路径--Bellm…

postgres 源码解析 45 btree分裂流程_bt_split

B树简介 B树一种多路平衡树&#xff0c;有如下特点&#xff1a; m阶B树表示每个节点最多含有m-1个元素&#xff0c;除了根节点之外&#xff0c;每个节点至少含有ceil(m/2)-1个元素。如5阶B树&#xff0c;每个节点最多4个元素&#xff0c;除根节点之外最少含有2个元素&#xf…

Java异常(Exception)处理及常见异常

很多事件并非总是按照人们自己设计意愿顺利发展的&#xff0c;经常出现这样那样的异常情况。 例如&#xff1a; 你计划周末郊游&#xff0c;计划从家里出发→到达目的→游泳→烧烤→回家。 但天有不测风云&#xff0c;当你准备烧烤时候突然天降大雨&#xff0c;只能终止郊游提…

Qt扫盲-QTableWidget理论总结

QTableWidget理论总结1. 概述2. QTableWidgetItem 概述3. 表头设置4. 常用功能5. 常用信号6. 槽函数7. 外观1. 概述 QTableWidget 是 Qt 提供的一个简单方便、标准的表格显示类。QTableWidget 中的 单元格数据 由 QTableWidgetItem 显示如果 想要一个使用你自己定义modle 的表…