数据结构——顺序表(java实现)

news2024/12/23 13:35:39

文章目录

  • 顺序表
    • 顺序表的定义
    • 代码实现:
      • 创建一个顺序表的类
      • 在顺序表中增加一条新的数据
      • 展示顺序表中内容
      • 在pos位置处插入一条数据
      • 判断顺序表中是否包含指定的数据
      • 查找某个数据在顺序表中的位置
      • 获取pos位置的元素
      • 将pos位置的元素改为value
      • 删除顺序表中第一个出现的数据
      • 清空顺序表:


顺序表

顺序表的定义

顺序表是线性表的一种
所谓线性表指一串数据的组织存储在逻辑上是线性的,而在物理上不一定是线性的
顺序表的底层实现是数组,其由一群数据类型相同的元素组成,其在逻辑与物理上均是线性的。

代码实现:

创建一个顺序表的类

在java中是将顺序表实现为一个类,所有与顺序表相关的属性与方法封装在这个类里面,这与c语言实现顺序表不同

public class MyArrayList {

    private  int [] array ;
    //记录当前顺序表中使用的空间的个数
    int usedsize = 0;
    //所有空间的个数,spacesize,默认为10
    public static final int DEFAULT_SIZE = 10;
    int spacesize =DEFAULT_SIZE ;

    public MyArrayList() {
        this.array = new int[DEFAULT_SIZE];
    }
}

在顺序表中增加一条新的数据

 public void add(int data) {
        //先保证空间足够
        spaceextends();
        array[usedsize++] = data;
    }

在顺序表中增加一条数据时,首先需要判断空间是否足够,如果不够,则需要扩容,我们把这一步骤专门封装成一个方法:

  private void  spaceextends(){  
        if(spacesize>usedsize){
            return ;
        }else {

            //调用数组本身的方法,使其扩展两倍
            this.array = Arrays.copyOf(this.array, this.array.length * 2);
            
            spacesize = spacesize * 2;
            return ;
        }
    }

展示顺序表中内容

public void display() {
        //展示顺序表中的元素
        for (int i = 0; i < usedsize; i++) {
            System.out.print(array[i]+" ");
        }

    }

测试一下

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        arrayList.display();
    }
}

在这里插入图片描述

在pos位置处插入一条数据

在pos位置处插入一条数据,则需要pos位置以及其后的数据全部向右移动一位
然后再在pos位置插入数据。

  1. 存在pos是否合法的问题,pos不能为负数,且pos的位置之前必须有元素(比如设置pos为200,但是数组中存放元素的下标只到5,那么中间195个位置均浪费掉了,所以要求pos之前必须有元素)
  2. 空间是否足够的问题,,需要调用我们之前定义的方法
     public void pos(int pos ,int data) {

        if (pos>usedsize|| pos<0){
                   throw new PosworongfulException("pos位置异常");
        }else {
            spaceextends();
            //下面的语句也符号usedsize==pos时
                for (int i = usedsize;i>=pos ;i--) {
                         array[i]  =     array[i-1];
                }
                array[pos] = data;
                usedsize++;
            }
        }

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        try {
                 arrayList.pos(1,5);//在1位置插入5
        }catch (PosworongfulException e){
            e.printStackTrace();
        }
        arrayList.display();
    }
}

在这里插入图片描述
测试:在-1位置插入10

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        try {
                 arrayList.pos(-1,10);
        }catch (PosworongfulException e){
            e.printStackTrace();
        }
        arrayList.display();
    }
}

在这里插入图片描述

判断顺序表中是否包含指定的数据

 public boolean contains(int toFind) {
          //判断是否包含指定的数据
        //需要遍历整个顺序表
        for (int i = 0; i < usedsize; i++) {
            if (array[i] == toFind){
                return true ;
            }
        }
        return false;
    }

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        System.out.println(arrayList.contains(20));
        System.out.println(arrayList.contains(5));
        arrayList.display();
    }

在这里插入图片描述

查找某个数据在顺序表中的位置

 public int indexof(int toFind) {
        //判断某个元素对应的位置
        //依然需要查找顺序表
        for (int i = 0; i < usedsize; i++) {
            if (array[i] ==toFind){
                //找到了返回i ,没找到返回-1
                return i;
            }
        }
        return -1;
    }
public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
     
        System.out.println(arrayList.indexof(5));
        System.out.println(arrayList.indexof(9));
        System.out.println(arrayList.indexof(20));
        //arrayList.display();
    }

}

在这里插入图片描述

获取pos位置的元素

 public int get(int pos) {
        //获取pos位置的元素
        //先判断pos 合不合法,是否小于usedsize
        if(pos >=usedsize||pos<0){
            System.out.println("输入的pos不合法");
           throw new PosworongfulException("Pos位置不合法");
        }else {
            return array[pos];
        }
    }

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        try {


            System.out.println(arrayList.get(1));
            System.out.println(arrayList.get(10));
        } catch (PosworongfulException e) {
            e.printStackTrace();
        }
    }

}

在这里插入图片描述

将pos位置的元素改为value

public void setValue(int pos, int value) {
        //将pos位置的值改为value
        //也需要判断pos位置合不合法
        if(pos >=usedsize||pos<0){
            System.out.println("输入的pos不合法");
            throw new PosworongfulException("Pos位置不合法");
        }else {
            array[pos] = value;

        }
    }

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        arrayList.display();
        System.out.println();
        try {
           arrayList.setValue(1,10);
           arrayList.setValue(10,5);
        } catch (PosworongfulException e) {
            e.printStackTrace();
        }
        arrayList.display();
    }




}

在这里插入图片描述

删除顺序表中第一个出现的数据

  public void remove(int toFind) {
        //删除第一次出现的关键字key
        //先判断此元素在数组中的下标
         int ret = this.indexof(toFind);
         if(ret ==-1){
             System.out.println("没有这个数字");
         }
         else {
             //将ret下标之后的数据往左移动一位
             for (int i = ret; i < usedsize-1; i++) {
                 this.array[i] = this.array[i+1];
             }
             this.usedsize--;

             
         }
    }

测试:

package demo1;

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        arrayList.display();
        System.out.println();
       arrayList.remove(5);
       arrayList.remove(20);
        arrayList.display();
    }

}

在这里插入图片描述

清空顺序表:

    public void clear() {
          //清空顺序表
          //对于基本数据类型则将usedsize置为0即可,因为我们是根据usedsize对数组进行操作的
        //usedsize为0,相当于顺序表为空,如果顺序表数据类型为引用数据类型,则需要将每个数组元素
        //置为null
        this. usedsize = 0;
    
    }

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

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

相关文章

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件&#xff0c;如果这些基础模块每个项目都实现一套&#xff0c;维护起来那真的头大&#xff0c;你说呢&#x1f609; 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子&#xff1a; myLib ├…

从零开始做题:好怪哦

题目 给出一个压缩文件 解题 方法1 01Edit打开&#xff0c;发现是个反着的压缩包&#xff08;末尾倒着的PK头&#xff09; import os# 目标目录路径 # target_directory /home/ai001/alpaca-lora# 切换到目标目录 # os.chdir(target_directory)# 打印当前工作目录以确认…

# Redis 入门到精通(一)数据类型(1)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;1&#xff09; 一 、Redis 入门到精通 基本介绍 1、Redis 基础 ( windows 环境 ) redis 入门数据类型通用命令Jedis 2、Redis 高级 ( linux 环境 ) 持久化redis.conf 配置事务集群 3、Redis 应用 ( linux…

WAIC | 2024年世界人工智能大会“数学与人工智能”学术会议成功举办!

由斯梅尔数学与计算研究院&#xff08;Smale Institue of Mathematics & Computation&#xff09;主办的2024年世界人工智能大会(WAIC)“数学与人工智能”学术会议7月4日在上海世博中心圆满落幕&#xff01;作为全球性高级别学术研讨会&#xff0c;此次会议由华院计算技术&…

SQLServer的系统数据库用别的服务器上的系统数据库替换后做跨服务器连接时出现凭证、非对称金钥或私密金钥的资料无效

出错作业背景&#xff1a; 公司的某个sqlserver服务器要做迁移&#xff0c;由于该sqlserver服务器上数据库很多&#xff0c;并且做了很多的job和维护计划&#xff0c;重新安装的sqlserver这些都是空的&#xff0c;于是就想到了把系统4个系统数据库进行替换&#xff0c;然后也把…

Camera Raw:裁剪

Camera Raw 的裁剪 Crop面板提供了裁剪、旋转、翻转、拉直照片等功能&#xff0c;通过它们可以更精确地调整照片的视角和范围&#xff0c;以达到最佳二次构图的视觉效果。 快捷键&#xff1a;C ◆ ◆ ◆ 使用方法与技巧 1、使用预设 选择多种裁剪预设&#xff08;如 1:1、16:…

JAVA基础-----128陷阱

一、何为128陷阱 Java中Integer类型在使用比较时的特殊行为------128陷阱&#xff0c;解释了当数值在-128到127范围内&#xff0c;由于valueOf方法的缓存机制导致地址相同&#xff0c;比较为真&#xff1b;超出这个范围则新分配内存&#xff0c;地址不同&#xff0c;比较为假。…

YOLOv10改进 | 主干篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络PE-YOLO中的PENet&#xff0c;PENet通过拉普拉斯金字塔将图像分解成多个分辨率的组件&#xff0c;增强图像细节和低频信息。它包括一个细节处理模块&#xff08;DPM&#xff09;&#xff0c;用于通过上下文分支和边…

数据链路层(超详细)

引言 数据链路层是计算机网络协议栈中的第二层&#xff0c;位于物理层之上&#xff0c;负责在相邻节点之间的可靠数据传输。数据链路层使用的信道主要有两种类型&#xff1a;点对点信道和广播信道。点对点信道是指一对一的通信方式&#xff0c;而广播信道则是一对多的通信方式…

办公必备——ONLYOFFICE8.1版本桌面编辑器

一、介绍ONLYOFFICE ONLYOFFICE是一款免费的开源办公软件&#xff0c;它可以让你创建、编辑和分享文档、表格和演示文稿。就像微软的Office一样&#xff0c;但它是完全免费的&#xff0c;而且可以在多种设备上使用&#xff0c;包括电脑和手机。它还支持多人同时在线编辑文档&am…

Golang | Leetcode Golang题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; func computeArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 int) int {area1 : (ax2 - ax1) * (ay2 - ay1)area2 : (bx2 - bx1) * (by2 - by1)overlapWidth : min(ax2, bx2) - max(ax1, bx1)overlapHeight : min(ay2, by2) - max(ay1, by1)…

独立开发者系列(22)——API调试工具apifox的使用

接口的逻辑已经实现&#xff0c;需要对外发布接口&#xff0c;而发布接口的时候&#xff0c;我们需要能自己简单调试接口。当然&#xff0c;其实自己也可以写简单的代码调试自己的接口&#xff0c;因为其实就是简单的request请求或者curl库读取&#xff0c;调整请求方式get或者…

第11章 规划过程组(二)(11.10制订进度计划)

第11章 规划过程组&#xff08;二&#xff09;11.10制订进度计划&#xff0c;在第三版教材第395~397页&#xff1b;文字图片音频方式 第一个知识点&#xff1a;定义及作用 分析活动顺序、持续时间、资源需求和进度制约因素&#xff0c;创建项目进度模型&#xff0c;从而落实项目…

基于单片机的太阳能热水器控制系统设计

随着我国经济水平的不断提高&#xff0c;民众对生活质量的追求也在不断进步&#xff0c;对于现代家庭而言&#xff0c;热水器成为了必备的生活电器。目前市面上的电器主要是电热水器、燃气热水器以及太阳能热水器。就能源节约性能而言&#xff0c;太阳能热水器占据了绝对优势&a…

01day C++初入学习

这里写目录标题 1.C区别于C的输入输出2.什么是命名空间3. namespace的定义namespace的使用(1)namespace嵌套使用(2)多⽂件中可以定义同名namespace(3) 4.命名空间的使用5.C输⼊&输出6.缺省参数7.函数重载8.引用8.1引用的特性8.3引用的使用 1.C区别于C的输入输出 #include&…

接口调用的三种方式

例子&#xff1a; curl --location http://110.0.0.1:1024 \ --header Content-Type: application/json \ --data {"task_id": 1 }方式一&#xff1a;postman可视化图形调用 方式二&#xff1a;Vscode中powershell发送请求 #powershell (psh) Invoke-WebRequest -U…

探展2024世界人工智能大会之令人惊艳的扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的知识库大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09;&#xff0c;这次非常荣幸受邀作为专业…

科研绘图系列:R语言分组柱状图一(Grouped Bar Chart)

介绍 分组柱状图(Grouped Bar Chart)是一种数据可视化图表,用于比较不同类别(分组)内各子类别(子组)的数值。在分组柱状图中,每个分组有一组并列的柱子,每个柱子代表一个子组的数值,不同的分组用不同的列来表示。 特点: 并列柱子:每个分组内的柱子是并列的,便于…

python-24-零基础自学python while循环+交互+数据的存储

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 文件处理 with open&#xff08;&#xff09;while 练习内容&#xff1a;10章练习题10-3、10-4、10-5 练习10-3&#xff1a;访客 编写一个程序&#xff0c;提示用户输入名字。用户做…

Redis基础教程(十五):Redis GEO地理信息查询与管理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…