数据结构与算法--顺序表(Java)

📝个人主页🌹:誓则盟约
⏩收录专栏⏪:Java SE
🤡往期回顾🤡:Java SE--基本数据类型(详细讲解)
🌹🌹期待您的关注 🌹🌹

什么是顺序表?

  • 顺序表是一种线性表的数据结构。
  • 顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素。

顺序表的主要特点:

  1. 逻辑上相邻的元素在物理位置上也相邻。
  2. 可以随机访问表中的任意元素,通过元素的位置序号可以在 O(1) 的时间复杂度内直接获取对应元素。
  3. 插入和删除操作的效率相对较低。例如,在顺序表的中间位置插入一个元素,需要移动大量后续元素,时间复杂度为 O(n) ;删除操作同理。

顺序表的优点:

  1. 随机访问速度快,能够快速获取指定位置的元素。
  2. 存储密度高,不需要额外的指针来链接元素。

顺序表的缺点:

  1. 长度固定,不易扩展。
  2. 插入和删除操作可能涉及大量元素的移动,效率较低。

        举个例子,如果有一个顺序表存储了学生的成绩 [85, 90, 78, 95, 88] ,如果要获取第三个学生的成绩,直接通过索引 2 就能快速得到 78 。但如果要在第二个位置插入一个新成绩 80 ,就需要将后面的元素 90, 78, 95, 88 依次向后移动一位,然后再插入 80 。

        顺序表在很多程序设计中都有应用,比如简单的数组实现、一些对随机访问要求较高而插入删除操作较少的场景等,今天我们用java来简单实现一下顺序表。


构造方法:    

    首先,构造一个顺序表,需要int capacity 表示顺序表的内存大小(这里先传入一个值作为参数,后面内存不够用我们会有专门申请内存的方法)、int size表示表里面元素的个数、Object [] array 来命名这个顺序表,这时候一个最基本的顺序表就被构造出来了,以下是代码实现:

public class Linear_List<E> {private  int capacity = 10;private int size=0;private Object [] array = new Object [capacity];

添加方法:

        要对顺序表array进行添加操作,需要传入两个参数 泛型 element 以及 int index,代表在index下标插入 泛型 element。

        注意:这里需要判断 index 和 size 的大小,如果index<0 || index>size,则理应抛出错误。

        在index位置插入元素,只需要将原来index以及index后面的元素往后移一位,空出来的位置给element即可。下面是添加方法的代码实现:

public void add(E element , int index) {if (index<0 || index>size)throw new IndexOutOfBoundsException("Index out of bounds");for (int i = size; i >index; i--) {array[i] = array[i-1];}array[index] = element;size++;}

        但是当顺序表中存储的元素数量达到当前分配的存储空间上限时,就需要进行扩容。具体来说,常见的情况有:

  • 持续向顺序表中添加元素,导致已分配的存储空间被填满。

        例如,最初分配的顺序表空间能存储 10 个整数,当已经存储了 10 个整数后,如果还需要继续添加新的整数,就需要扩容。

  • 事先无法准确预估元素数量,且实际存储的元素数量超出了初始的预计。

        假设一个用于存储用户订单信息的顺序表,由于促销活动导致订单数量大幅增加,超出了初始分配的空间。

  • 业务需求发生变化,导致需要存储更多的元素。

        比如原本的系统只需要存储一个月内的交易记录,但业务调整后需要存储半年甚至更长时间的交易记录,原有的顺序表空间可能就不够了。

        在进行扩容时,通常会重新分配一块更大的连续存储空间,并将原有的元素复制到新的空间中。扩容的策略可以是按照一定的比例增加空间,例如每次扩容为原来的两倍;也可以是增加固定的大小,如每次增加一定数量的存储单元,原来的那块空间也并不会造成空间浪费,通常会被JVM的垃圾回收机制自动回收。

        通常把扩容操作放在添加方法内部,因为在添加元素时才会有可能需要用到扩容操作,以下是添加了扩容操作的添加方法的代码实现:

public void add(E element, int index) {// 如果索引不在有效范围内,抛出异常if (index < 0 || index > size)throw new IndexOutOfBoundsException("Index out of bounds");// 如果当前元素数量达到容量,进行扩容操作if (size >= capacity) {  int newCapacity = capacity * 2;  // 新容量为原容量的两倍Object[] newArray = new Object[newCapacity];  // 创建新的数组System.arraycopy(array, 0, newArray, 0, size);  // 将原数组内容复制到新数组array = newArray;  // 更新数组引用capacity = newCapacity;  // 更新容量}// 将指定索引及之后的元素向后移动一位for (int i = size; i > index; i--) {array[i] = array[i - 1];}array[index] = element;  // 在指定索引位置插入新元素size++;  // 元素数量加 1
}

删除方法:

        首先,要检查删除操作中指定的索引是否合法。如果索引小于 0 或者大于等于顺序表的当前元素数量,就会抛出一个索引越界的异常,因为这样的索引不存在有效的元素可删除。

        若索引合法,就将指定索引位置之后的元素依次向前移动一位,覆盖要删除的元素位置。然后,把原本顺序表的最后一个位置设置为 null,并将顺序表的元素数量减 1,表示完成了一个元素的删除操作。以下是删除方法的代码实现:

public E remove(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");E key = (E) array[index];for (int i = index; i <size; i++) {array[i] = array[i+1];}size--;return key;}

判空和get方法:

        判空方法通常用于判断顺序表是否为空。这可以通过检查顺序表中元素的数量来实现。如果元素数量为 0 ,则认为顺序表为空。

        get方法用于获取顺序表中指定索引位置的元素。在实现时,需要先检查索引的合法性,如果索引不合法(小于 0 或大于等于元素数量),则抛出异常。如果索引合法,就返回该索引位置的元素。以下是两种方法的代码实现:

 public boolean is_Empty(){return size==0;}public E get(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");return (E) array[index];}

转字符串输出(toString)方法:

        toString方法其主要目的是将顺序表的相关信息以字符串的形式进行展示。通常会先获取顺序表中实际存储元素的数组部分,并将其转换为字符串表示。同时,还会获取顺序表中当前元素的数量。

        当调用顺序表对象的 toString 方法时,就能得到一个清晰反映顺序表内部状态的字符串描述,方便进行输出、调试或其他需要以字符串形式获取顺序表信息的操作。以下是toString方法的代码实现:

    public String toString() {StringBuilder builder = new StringBuilder();for (int i = 0; i < size; i++){builder.append(array[i]).append(" "); }return builder.toString();}

完整代码实现:

public class Linear_List<E> {private  int capacity = 10;private int size=0;private Object [] array = new Object [capacity];public void add(E element , int index) {if (index<0 || index>size)throw new IndexOutOfBoundsException("Index out of bounds");if (size>=capacity){  // 扩容int newCapacity = capacity*2;Object[] newArray = new Object[newCapacity];System.arraycopy(array,0,newArray,0,size);array = newArray;capacity = newCapacity;}for (int i = size; i >index; i--) {array[i] = array[i-1];}array[index] = element;size++;}public E remove(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");E key = (E) array[index];for (int i = index; i <size; i++) {array[i] = array[i+1];}size--;return key;}public boolean is_Empty(){return size==0;}public E get(int index) {if (index<0 || index>size-1)  throw new IndexOutOfBoundsException("Index out of bounds");return (E) array[index];}public String toString() {StringBuilder builder = new StringBuilder();for (int i = 0; i < size; i++) { builder.append(array[i]).append(" "); }return builder.toString();}
}

“静静地目送,享受这一刻,在混乱之中。”——《xingyu_xuan》

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

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

相关文章

每日任务:TCP/IP模型和OSI模型的区别

介绍一下TCP/IP模型和OSI模型的区别&#xff1f; OSI模型由国标准化组织提出&#xff0c;而TCP/IP模型是由美国国防部开发的&#xff1b; OSI模型由七个层次组成&#xff0c;从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而TCP/IP模型只有四层…

AI视频生成(即梦)

1.打开即梦网页版 https://jimeng.jianying.com/ai-tool/home 2.图片生成-导入参考图&#xff08;这里原本的红色或者灰度图都是可以的&#xff09;-精细度5&#xff08;最高图质量越高&#xff09; 注&#xff1a;根据需要&#xff0c;选择不同的生图模型&#xff0c;具有…

线上监控诊断 - Arthas

简介 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并且能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;…

SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)

1. 背景 在 SAPUI5 中&#xff0c;Fragments 是一种轻量级的 UI 组件&#xff0c;类似于视图&#xff08;Views&#xff09;&#xff0c;但它们没有自己的控制器&#xff08;Controller&#xff09;。Fragments 通常用于定义可以在多个视图中重用的 UI 片段&#xff0c;从而提…

项目实战1(30小时精通C++和外挂实战)

项目实战1&#xff08;30小时精通C和外挂实战&#xff09; 01-MFC1-图标02-MFC2-按钮、调试、打开网页05-MFC5-checkbox及按钮绑定对象06--文件格式、OD序列号08-暴力破解09-CE10-秒杀僵尸 01-MFC1-图标 这个外挂只针对植物大战僵尸游戏 开发这个外挂&#xff0c;首先要将界面…

FPGA:流水灯设计

本次基于FPGA实现流水灯&#xff0c;即让LED[0:7]从左到右依次电量&#xff0c;每个LED灯频闪周期为1s钟&#xff0c;在这里&#xff0c;给出下面三种实现思路&#xff1a; 1、实验思路 1、使用位运算符 在复位时令LED灯为LED8’b0000_0001&#xff0c;然后每过一秒钟&#x…

软考:软件设计师 — 7.软件工程

七. 软件工程 1. 软件工程概述 &#xff08;1&#xff09;软件生存周期 &#xff08;2&#xff09;软件过程 软件开发中所遵循的路线图称为 "软件过程"。 针对管理软件开发的整个过程&#xff0c;提出了两个模型&#xff1a;能力成熟度模型&#xff08;CMM&#…

嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)

目录 项目概述 系统设计 硬件设计 软件设计 系统架构图 代码实现 1. STM32微控制器与传感器代码 代码讲解 2. MQTT Broker设置 3. 数据接收与处理 代码讲解 4. 数据存储与分析 5. 数据分析与可视化 代码讲解 6. 数据可视化 项目总结 项目概述 随着电子商务的快…

简单小案例分析

一、容器和实例关系 <div class"app"><h1>Hello,{{name}}</h1> </div> <div class"app"><h1>Hello,{{name}}</h1> </div><script>//创建Vue实例new Vue({el:".app", //el用于指定当前V…

暴风骑士S9电摩上市,定义青少年骑行安全新标准

暴风骑士&#xff0c;作为全球高端儿童电动车的开创品牌&#xff0c;以其卓越的技术实力和创新精神&#xff0c;不断推动行业发展。如今&#xff0c;暴风骑士再次突破自我&#xff0c;推出了全新力作——S9青少年电摩。这款全新上市的青少年专属电摩&#xff0c;以其领先的安全…

LCD 横屏切换为竖屏-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

LCD 横屏切换为竖屏 横屏显示如何切换为竖屏显示 LCD 屏默认横屏显示 开发板配套的 LCD 屏默认都是横屏显示&#xff0c;如 4.3 寸、7 寸和 10.1 寸的不同分辨率的 RGB LCD 屏 固定坐标体系 &#xff08;以 800*480 分辨率为例&#xff09;横屏模式下的固定坐标&#xff1a;…

某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]

文章目录 某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某数据泄露防护(DLP)系统NoticeAjax接口SQL注入漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内…

Vitis AI 使用 VAI_Q_PYTORCH 工具

目录 1. 简介 2. 资料汇总 3. 示例解释 3.1 快速上手示例 4. 总结 1. 简介 vai_q_pytorch 是 Vitis AI Quantizer for Pytorch 的缩写&#xff0c;主要作用是优化神经网络模型。它是 Vitis AI 平台的一部分&#xff0c;专注于神经网络的深度压缩。 vai_q_pytorch 的作用…

如何应对SQL注入攻击?

引言 在现今的网络世界中&#xff0c;安全性已成为至关重要的话题。SQL注入&#xff08;SQL Injection&#xff09;是一种常见且危险的网络攻击方式&#xff0c;攻击者通过向SQL查询中插入恶意代码来操控数据库&#xff0c;从而获取敏感信息或破坏数据。了解SQL注入的各种类型…

2024中国大学生算法设计超级联赛(2)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 鸡爪解题思…

AI在Facebook的应用:预见智能化社交的新前景

在数字化时代&#xff0c;社交媒体平台已成为我们生活的重要组成部分&#xff0c;而人工智能&#xff08;AI&#xff09;的快速发展正推动着这些平台向更智能、更个性化的方向发展。Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;正不断探索和应用AI技术&…

MySQL作业四

1. 创建数据库mydb15_indexstu 2. 创建表student&#xff0c;course&#xff0c;sc 2.1 创建表student 2.2 创建表course 2.3 创建表sc 3. 处理表 3.1 修改表student中年龄&#xff08;sage&#xff09;字段属性&#xff0c;数据类型由int改变为smallint 3.2 为表course中cno…

智能算法驱动的爬虫平台:解锁网络数据的无限潜力

摘要 在信息爆炸的时代&#xff0c;网络数据如同深海宝藏&#xff0c;等待着有识之士发掘其无尽价值。本文将探索智能算法驱动的爬虫平台如何成为解锁这一宝库的关键&#xff0c;不仅剖析其技术优势&#xff0c;还通过实例展示它如何助力企业与开发者高效、稳定地采集数据&…

专家访谈|王本友:分不清9.11和9.9谁大?大模型该做擅长的,而不是事事完美

作为生成式人工智能的代表&#xff0c;大模型已经进入全新的发展阶段。 红星新闻、红星资本局与OpenEval平台联合发起“巢燧杯”大模型创新发展大赛&#xff0c;已于本月正式启动。2024“巢燧杯”大模型创新发展大赛由通用大模型评测、行业大模型评测大赛、专项挑战赛、大模型…

JavaScript模拟滑动手势

双击回到顶部 左滑动 右滑动 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Gesture…