java - 数据结构,顺序表

news2024/11/25 0:32:24

1、顺序表和链表都属于数据结构的一部分。
2、数据结构:C的数据结构和JAVA的数据结构有什么不一样啊?
数据结构只是一个单独的学科,和语言没有关系。
用不同的语言实现一样的逻辑。

一、线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
在这里插入图片描述

二、顺序表 - ArrayList

2.1、概念及结构

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

顺序表一般可以分为:

  • 静态顺序表:使用定长数组存储。
  • 动态顺序表:使用动态开辟的数组存储

静态顺序表适用于确定知道需要存多少数据的场景.
静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用
相比之下动态顺序表更灵活, 根据需要动态的分配空间大小.
在这里插入图片描述

2.2、模拟实现顺序表 - MyArrayList

2.2.1、顺序表的属性

public class MyArrayList {
    //存储数据的数组
    public int[] elem;
    //usedSize 拿到的是 数组元素的有效个数
    public int usedSize;

    public MyArrayList(){
        //构造方法,初始化数组的大小为10
        this.elem = new int[10];
    }
}

在这里插入图片描述

2.2.2、顺序表的方法

打印顺序表
// 打印顺序表
    public void display() {
        for(int i = 0; i < usedSize; i++){
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }

在这里插入图片描述

获取顺序表长度
// 获取顺序表长度
    public int size() {
    	//usedSize 就是数组元素的有效数据个数,所以这就是顺序表的长度
        return usedSize;
    }
在 pos 位置新增元素
// 在 pos 位置新增元素
    public void add(int pos, int data) {
        if(pos < 0 || pos > usedSize){
            System.out.println(pos + "位置不合法,增加失败!");
            return;
        }
        if(isFull()) {
            //扩容,如果顺序表满了,就扩容,没有满就不扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //向后移元素
        for (int i = usedSize - 1; i > pos ; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //插入元素
        this.elem[pos] = data;
        //有效数据+1
        usedSize++;
    }

    //判断数组是否满了,如果满了返回true,没有满返回false
    public boolean isFull(){
        return this.usedSize == this.elem.length;
    }

在这里插入图片描述

判定是否包含某个元素
// 判定是否包含某个元素
    public boolean contains(int toFind) {
        for(int i = 0; i < usedSize; i++){
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }
查找某个元素对应的位置
 // 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1
    public int search(int toFind) {
        for(int i = 0; i < this.usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }
获取 pos 位置的元素
// 获取 pos 位置的元素
    public int getPos(int pos) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return -1;
        }
        return this.elem[pos];
    }
给 pos 位置的元素设为 value
// 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return;
        }
        this.elem[pos] = value;
    }
删除第一次出现的关键字
// 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1
    public int search(int toFind) {
        for(int i = 0; i < this.usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }


    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        //判断顺序表是否为空
        if(this.usedSize == 0){
            System.out.println("顺序表为空,删除失败");
            return;
        }
        //index == -1,说明没有这个数据
        int index = search(toRemove);
        if(index == -1){
            System.out.println("没有你要找的数据");
            return;
        }
        //移动元素
        for(int i = index; i < this.usedSize-1; i++){
            this.elem[i] = this.elem[i+1];
        }
        //记录有效数据
        this.usedSize--;
    }
清空顺序表
public void clear() {
        this.usedSize = 0;
    }
测试

在进行测试的时候,两边中间都要测试


public class TestDome {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0,55);
        myArrayList.add(1,30);
        myArrayList.add(2,5);
        myArrayList.add(3,5);
        myArrayList.display();

        myArrayList.remove(55);
        myArrayList.display();
        myArrayList.clear();
        myArrayList.display();

    }
}

模拟实现 - MyArrayList

public class MyArrayList {
    //存储数据的数组
    public int[] elem;
    //usedSize 拿到的是 数组元素的有效个数
    public int usedSize;

    public MyArrayList(){
        //构造方法,初始化数组的大小为10
        this.elem = new int[10];
    }

    // 打印顺序表
    public void display() {
        for(int i = 0; i < usedSize; i++){
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }

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

    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        if(pos < 0 || pos > usedSize){
            System.out.println(pos + "位置不合法,增加失败!");
            return;
        }
        if(isFull()) {
            //扩容,如果顺序表满了,就扩容,没有满就不扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //向后移元素
        for (int i = usedSize - 1; i > pos ; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //插入元素
        this.elem[pos] = data;
        //有效数据+1
        usedSize++;
    }

    //判断数组是否满了,如果满了返回true,没有满返回false
    public boolean isFull(){
        return this.usedSize == this.elem.length;
    }

    //扩容,如果顺序表满了,就扩容
    public void dilatation(){
        if(this.usedSize == this.elem.length){
            this.elem = Arrays.copyOf(this.elem,this.elem.length*2);
        }
    }

    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for(int i = 0; i < usedSize; i++){
            if(elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

    // 获取 pos 位置的元素
    public int getPos(int pos) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return -1;
        }
        return this.elem[pos];
    }
    // 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            return;
        }
        this.elem[pos] = value;
    }

    // 查找某个元素对应的位置,找到返回该元素下标,没找到返回-1
    public int search(int toFind) {
        for(int i = 0; i < this.usedSize; i++){
            if(elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }


    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        //判断顺序表是否为空
        if(this.usedSize == 0){
            System.out.println("顺序表为空,删除失败");
            return;
        }
        //index == -1,说明没有这个数据
        int index = search(toRemove);
        if(index == -1){
            System.out.println("没有你要找的数据");
            return;
        }
        //移动元素
        for(int i = index; i < this.usedSize-1; i++){
            this.elem[i] = this.elem[i+1];
        }
        //记录有效数据
        this.usedSize--;
    }

    // 清空顺序表
    public void clear() {
//        for(int i = this.usedSize - 1; i <= 0; i--){
//            this.elem[i] = 0;
//        }
        this.usedSize = 0;
    }
}

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

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

相关文章

如何使用远程Linux虚拟机的图形界面

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录VMware Workstation ProSmarTTY在工作过程中&#xff0c;有时需要操作远…

微机----------LED显示接口

目录 LED显示器的工作原理采用专用芯片进行LED段译码软件译码法静态显示与动态显示LED显示器的工作原理 LED显示器的主要部分是七段发光管,这七段发光段分别称为a、b、c、d、e、f、g有的产品还附带有一个小数点DP。通过7个发光段的组合,可以显示0 ~ 9 和 A ~ F共16个字母数字…

果然AIGC还是对动漫制作下手了,不过是从数据集AnimeRun开始

原文链接&#xff1a;https://www.techbeat.net/article-info?id4327 作者&#xff1a;seven_ 最近AIGC领域的新工作几乎呈现一种井喷式的发展&#xff0c;借助AI模型天马行空的想象力&#xff0c;研究者们开始在各种图像和视频内容领域发力&#xff0c;本文介绍一篇发表在Neu…

MybatisPlus 处理保存实体对象时,对于枚举类型的数据库存储问题

MybatisPlus 处理保存实体对象时&#xff0c;对于枚举类型的数据库存储问题1. 前言1.1 先看问题代码1.2 存在的问题2. 解决前言问题2.1 自定义枚举2.2 附源码&#xff1a;3. 参考4. 推荐 Mybatis、MybatisPlus 其他相关问题的文章1. 前言 1.1 先看问题代码 如下&#xff1a;枚…

告别人工叫号!门诊排队叫号系统,这样配置,性价比高

很多人认为&#xff0c;那些大医院的叫号系统&#xff0c;确实既高效便捷、又能展现门诊综合服务实力。 但安装配置较为复杂&#xff0c;内部软件与硬件对接存在难度&#xff0c;价格也相对昂贵&#xff0c;对部分医院来讲&#xff0c;预算稍有不足&#xff0c;怎么办&#xff…

serverless-OpenWhisk安装

1.安装 默认我们已经有了一个k8s集群&#xff0c;采用helm方式安装。以下操作均在 Master 节点执行。 helm要求Helm v3.2.0或以上版本。 多节点worker打标签 如果要将OpenWhisk部署到具有多个工作节点的群集&#xff0c;我们建议使用节点关联将用于OpenWhisk控制平面的计算节点…

【论文阅读笔记】Pyramid Real Image Denoising Network

论文简介 本文是19年的论文&#xff0c;网络名为PRIDNet。代码地址为https://github.com/491506870/PRIDNet。在1080ti上&#xff0c;PRIDNet处理512x512图像需要大约50ms&#xff1b; 尽管深度卷积神经网络在特定噪声和去噪方面展示出非凡能力&#xff0c;但对于真实世界的噪声…

最好的天线基础知识!超实用 随时查询

天线作为无线电的发射和接收设备是影响信号强度和质量的重要设备,其在移动通信领域的重要性非常关键。通过对天线选型,天线安装,天线调整从而保障基站覆盖区域的信号强度与质量。对其的 掌握程度是网规与网优工程师的技能基本要求之一。下文重点说明天线要掌握哪些方面及其原理…

jenkins配置钉钉机器人推送job构建信息

文章目录一、注册钉钉&#xff0c;创建群聊二、创建钉钉机器人&#xff0c;获取webhook三、jenkins安装DingTalk插件四、jenkins系统配置—配置钉钉1、找到钉钉配置项&#xff0c;继续配置五、jenkins的job内配置钉钉六、构建job&#xff0c;并发送钉钉信息推送Q & A一、注…

[iOS]App Store Connect添加银行卡时的CNAPS代码查询

App Store Connect 协议、税务和银行业务中&#xff0c;给付费APP类型添加银行卡需要填写CNAPS代码CNAPS代码&#xff0c;其实就是联行号。 联行号又称大额行号、银联号、银行行号或CNAPS号。 银行联行号查询

JavaScript -- 06.函数知识汇总

文章目录函数1 函数介绍2 函数的创建方式2.1 函数声明2.2 函数表达式2.33 参数3.1 函数声明3.2.函数表达式3.3 箭头函数3.4 默认参数3.5 使用对象作为参数3.6 函数作为参数4 函数的返回值5 作用域5.1 函数作用域5.2 作用域链5.3 练习6 window对象7 提升7.1 变量的提升7.2 函数的…

【深度学习】详解 ViLT

目录 摘要 一、引言 二、背景 2.1 视觉和语言模型的分类法 2.2 模态交互模式 2.3 视觉嵌入方案 2.3.1 区域特征 2.3.2 网格特征 2.3.3 图像块投影 三、视觉和语言 Transformer 3.1 模型概述 3.2 预训练目标 3.2.1 图像文本匹配 3.2.2 掩码语言建模 3.2.3 全…

文件包含漏洞详解

文件包含漏洞详解1.文件包含漏洞介绍1.1.文件包含漏洞解释1.2.文件包含漏洞原理1.3.文件包含的函数1.3.1.常见的文件包含函数1.3.2.PHP函数区别&#xff1a;1.4.文件包含漏洞特征1.5.文件包含漏洞分类1.5.1.本地文件包含漏洞  1.5.1.1.本地文件包含漏洞案例1.5.2.远程文件包含…

echarts-wordcloud ——文字云制作企业标签——基础积累

最近看到同事在写文字云的效果&#xff0c;最终效果图如下&#xff1a; 使用的是echarts-wordcloud插件&#xff1a; 下面介绍一下使用步骤&#xff1a; 1.npm安装echarts-wordcloud——npm install echarts-wordcloud --save 安装echarts-wordcloud的前提是也要安装echart…

谷粒学院——Day09【整合阿里云视频点播】

❤ 作者主页&#xff1a;Java技术一点通的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是Java技术一点通&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得关注、点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习&#xff0c;共同进步&#xff01;&am…

YOLOv5使用方法记录

YOLOv5使用方法记录 本次主要是记录使用yolov5检测图片和视频的过程 下载源码 地址为&#xff1a;https://github.com/ultralytics/yolov5 配置环境 有两种方法 按照requirements 通过下述命令安装源码中给出的配置环境文件 pip install -r requirements.txt选择自己需…

诠释韧性增长,知乎Q3财报里的社区优势和商业化价值

当内容平台开始做生意&#xff0c;往往意味着它要扮演一个大包大揽的角色&#xff1a;从内容的可持续性到最终变现&#xff0c;设计一套完整的生态系统是必需的。 但并非所有平台都对此感到棘手&#xff0c;或者说在某些平台&#xff0c;生态已经不是困难&#xff0c;而是优势…

linux内核源码分析 - nvme设备的初始化

驱动的加载 驱动加载实际就是module的加载,而module加载时会对整个module进行初始化,nvme驱动的module初始化函数为nvme_init(),如下: static struct pci_driver nvme_driver {.name "nvme",.id_table nvme_id_table,.probe nvme_probe,.remo…

leetcode 746. 使用最小花费爬楼梯

文章目录题目思考代码和注释总结题目 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到…

Charles抓取接口报文并修改各种参数信息调试

1.首先介绍Charles面板 图上顶部工具栏常用介绍&#xff1a; 1是清除按钮&#xff1a;点击后将清空左侧抓取的接口列表&#xff0c;如果接口太多&#xff0c;可以点击该按钮清空列表&#xff0c;重新发起请求&#xff0c;一目了然&#xff1b; 2.是停止按钮&#xff1a;点击该按…