iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java数据结构顺序表从零基础到精通进阶
  • 427
分享到

Java数据结构顺序表从零基础到精通进阶

2024-04-02 19:04:59 427人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、什么是线性表二、顺序表三、手撕顺序表属性定义构造方法接口实现确保顺序表空间增加元素打印顺序表判断顺序表中是否包含某个元素查找元素获取 pos 位置的元素将 pos 位置的元素

一、什么是线性表

线性表是最基本、最简单、也是最常用的一种数据结构。线性表*(linear list)*是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。常见的线性表有顺序表,链表,栈,队列,字符串

注意:这里说的线性表都指的是逻辑结构,也就是他们的逻辑结构是线性的,但物理结构却不一定是线性的。

在数据结构逻辑层次上细分,线性表可分为一般线性表和受限线性表。一般线性表也就是我们通常所说的“线性表”,可以自由的删除或添加结点。受限线性表主要包括栈和队列,受限表示对结点的操作受限制

二、顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中

顺序表可以分为以下两类:

  • 静态顺序表:通过定长数组实现
  • 动态顺序表:数组长度可动态增长

静态顺序表比较死板,如果数组长度太小,担心后面数据存不下,太大,又会有空间浪费.

所以我们一般都用动态增长的顺序表,按需所取.

三、手撕顺序表

学习数据结构的过程中,我们不仅要学会如何用数据结构,懂得它的理论部分,更要亲自动手去实践,将数据结构实现一遍,这样的话理解会更深刻

顺序表中我们如果只是单纯拿一个数组去用的话就会出现:顺序表中到底有多少有效数据,满了还是没满等问题,所以我们在实现顺序表的时候都还会再加一个size(有效数据个数)属性(顺序表的容量可以通过data.length获得)

属性定义


public class MyArrayList {
    public int[] data;    // 存储数据
    public int size;    // 有效数据个数
}

构造方法


public MyArrayList() {
    this.data = new int[10];   // 后面不够再增容
    this.size = 0;    // 初始无有效数据,size 为0
}

接口实现

对于顺序表我们一般都会有以下接口需要去实现:


// 打印顺序表
public void display();
// 在 pos 位置增加元素
public void add(int pos, int num);
// 判断顺序表中是否包含某个元素
public boolean contains(int num);
// 查找某个元素所在位置
public int search(int key);
// 获取 pos 位置的元素
public int getPos(int pos);
// 将 pos 位置的元素值设为 value
public void setPos(int pos, int value);
//删除第一次出现的关键字key
public void remove(int key);
// 获取顺序表长度
public int size();
// 清空顺序表
public void clear();

在实现这些接口的过程中,凡是涉及到数组下标的,我们都要进行下标合法性的检验,并且要注意用size,还是data.length

确保顺序表空间

在对顺序表增加元素的时候,我们一定要确保顺序表有足够的空间去增加元素,否则就会导致数组下标越界等情况发生


private void ensureCapacity() {
    if (this.size == this.data.length) {
        // 说明满了,该扩容了
        this.data = Arrays.copyOf(this.data, 2 * this.data.length);
    }
}

增加元素

往顺序表中增加元素的时候要注意可以在size位置去加元素(相当于尾插),同时也要确保顺序表有空间足够插入,在移动元素的时候要注意边界情况(下标越界,移动元素过多等),也别忘了size++


public void add(int pos, int num) {
    if (pos < 0 || pos > this.size) {    // 检验下表合法性
        throw new RuntimeException("ArrayIndexOutOfBoundsException : " + pos);
    }
    ensureCapacity();
    for (int i = this.size; i > pos; i--) {
        this.data[i] = this.data[i - 1];
    }
    this.data[pos] = num;
    this.size++;
}

打印顺序表

注意这里只打印有效数据


public String printMyArrayList() {
    String str = "[";
    for (int i = 0; i < this.size - 1; i++) {   // for循环中的右边界应该用size而不用data.length
        str += this.data[i] + ", ";
    }
    str += this.data[this.size - 1];
    str += "]";
    return str;
}

测试

对前面写的三个接口做测试


public class UseArrayList {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0, 0);
        myArrayList.add(1, 1);
        myArrayList.add(2, 2);
        myArrayList.add(3, 3);
        myArrayList.add(4, 2);
        myArrayList.add(0, 100);   // 头插
        myArrayList.add(2, 666);   // 中间插
        System.out.println(myArrayList.printMyArrayList());
    }
}

运行结果:

判断顺序表中是否包含某个元素


public boolean contains(int num) {
    for (int i = 0; i < this.size; i++) {
        if (this.data[i] == num) {
            return true;
        }
    }
    return false;
}

测试:


public class UseArrayList {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0, 0);
        myArrayList.add(1, 1);
        myArrayList.add(2, 2);
        myArrayList.add(3, 3);
        System.out.println(myArrayList.contains(3));
        System.out.println(myArrayList.contains(2));
        System.out.println(myArrayList.contains(0));
        System.out.println(myArrayList.contains(666));
    }
}

运行结果:

查找元素

查找顺序表中某个元素的位置(返回下标)


public int search(int key) {
    for (int i = 0; i < this.size; i++) {
        if (this.data[i] == key) {
            return i;
        }
    }
    return -1;    // 不存在这个元素,返回-1
}

测试:


public class UseArrayList {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0, 0);
        myArrayList.add(1, 1);
        myArrayList.add(2, 2);
        myArrayList.add(3, 3);
        System.out.println(myArrayList.search(0));
        System.out.println(myArrayList.search(3));
        System.out.println(myArrayList.search(666));
    }
}

获取 pos 位置的元素

注意:size位置为无效元素


public int getPos(int pos) {
    if (pos < 0 || pos >= this.size) {
        throw new RuntimeException("ArrayIndexOfBoundsException : " + pos);
    }
    return this.data[pos];
}

测试:


public class UseArrayList {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0, 0);
        myArrayList.add(1, 1);
        myArrayList.add(2, 2);
        myArrayList.add(3, 3);
        System.out.println(myArrayList.getPos(0));
        System.out.println(myArrayList.getPos(3));
        System.out.println(myArrayList.getPos(1));
        System.out.println(myArrayList.getPos(6));
    }
}

将 pos 位置的元素值设为 value

这里不涉及元素的移动


public void setPos(int pos, int value) {
    if (pos < 0 || pos >= this.size) {     // size位置为无效元素
        throw new RuntimeException("ArrayIndexOfBoundsException : " + pos);
    }
    this.data[pos] = value;
}

测试:


public class UseArrayList {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0, 0);
        myArrayList.add(1, 1);
        myArrayList.add(2, 2);
        myArrayList.add(3, 3);
        myArrayList.setPos(0, 666);
        myArrayList.setPos(3, 777);
        System.out.println(myArrayList.printMyArrayList());
    }
}

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

注意在删除的时候的数组边界以及改变size


public void remove(int key) {
    int pos = search(key);
    if (pos == -1) {
        return;        // 若是这个数字不存在,则返回
    }
    for (int i = pos; i < this.size - 1; i++) {
        this.data[i] = this.data[i + 1];      // 从后往前挪,直接将要删除的数字覆盖掉
    }
    this.size--;
}

获取顺序表长度


public int size() {
    return this.size;
}

清空顺序表


public void clear() {
    this.size = 0;
}

删除所有的key

如果我们想要删除顺序表中所有的key,如何做?

法一:我们可以将第一次出现的key删除完之后再继续搜索若有,则删除,没有则删除完毕


public void removeAll(int key) {
    for (int i = 0; i < this.size; i++) {
        if (this.search(key) != -1) {
            remove(key);
        } else {
            return;
        }
    }
}

法二:我们可以转变以下思路,不直接删除key,而是重新创建一个数组,将源数组中不是key的值复制到新数组,再让原数组的引用指向新数组,间接完成删除操作


public void removeAllPlus(int key) {
    int[] newData = new int[this.data.length];    // 新数组长度应该和源数组长度相同
    int j = 0;
    for (int i = 0; i < this.size; i++) {
        if (this.data[i] != key) {
            newData[j] = this.data[i];
            j++;
        }
    }
    this.data = newData;
    this.size = j;
}

注意:在元素复制完之后要改变源数组的引用,并改变顺序表的size

法三:我们既然可以通过复制的方式实现间接删除操作,那么我们可以想着将原数组就当成目标数组,即两个指针,一个数组


public void removeAllPlusPlus(int key) {
    int dest = 0;
    for (int src = 0; src < this.size; src++) {
        if (this.data[src] != key) {
            this.data[dest] = this.data[src];
            dest++;
        }
    }
    this.size = dest;
}

到此这篇关于Java数据结构顺序表从零基础到精通进阶的文章就介绍到这了,更多相关Java 顺序表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java数据结构顺序表从零基础到精通进阶

本文链接: https://www.lsjlt.com/news/143571.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java数据结构顺序表从零基础到精通进阶
    目录一、什么是线性表二、顺序表三、手撕顺序表属性定义构造方法接口实现确保顺序表空间增加元素打印顺序表判断顺序表中是否包含某个元素查找元素获取 pos 位置的元素将 pos 位置的元素...
    99+
    2024-04-02
  • 【架构师】零基础到精通——架构演进
    博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小留言:哈喽...
    99+
    2023-09-14
    架构 服务器 运维 系统架构
  • HTML 有序列表的指南:从零基础到精通
    有序列表是 HTML 中一种强大的工具,可为您的文档创建结构化和可读性强的列表。通过了解有序列表的基本语法、属性和高级技术,您可以创建令人印象深刻且用户友好的 веб-页面。 语法 有序列表使用 <ol> 元素创建,其中包含 ...
    99+
    2024-04-02
  • 从基础到精通:Java 并发集合进阶指南
    并发集合是 Java 集合框架中的特殊集合类,专为多线程环境而设计。它们提供线程安全机制,确保多个线程可以同时访问和修改集合,而不会出现数据损坏或不一致的情况。 核心并发集合 Java 并发集合框架包含以下核心集合类: Concurre...
    99+
    2024-04-03
    并发集合概述
  • Java数据结构之ArrayList从顺序表到实现
    目录1 ArrayList2 ArrayList使用2.1 ArrayList的构造2.2 ArrayList常见操作2.3 ArrayList的遍历2.4 ArrayList的扩容...
    99+
    2023-05-18
    Java ArrayList Java ArrayList顺序表
  • Python 语法的进阶指南:从基础到精通
    基础语法回顾 数据类型:Python提供多种数据类型,如整数、浮点数、字符串、布尔值和列表。 运算符:Python支持算术运算符(+、-、*、/)、比较运算符(==、!=、>、<)和逻辑运算符(and、or、not)。 控...
    99+
    2024-02-19
    Python语法 高级特性 函数 模块 装饰器
  • Java数据结构之顺序表和链表精解
    目录前言1. 顺序表代码实现2. 链表链表图解代码实现前言 两个数据结构:顺序表和链表 数据结构是一门学科,和语言无关。 数据 + 结构:一种描述和组织数据的方式。 1. 顺序表 顺...
    99+
    2024-04-02
  • C++零基础精通数据结构之带头双向循环链表
    目录与单链表的区别代码的实现接口节点的构造初始化链表开辟节点销毁链表打印链表尾插链表尾删链表头插链表头删链表查找链表链表pos位置的删除总结与单链表的区别 单向/双向 单向:只有一个...
    99+
    2024-04-02
  • HTML 图像标签进阶指南:从基础到精通
    HTML 图像标签 () 用于在网页中嵌入图像。它包含三个必备属性: src: 图像文件的 URL alt: 图像的替代文本,在图像无法加载时显示 width: 图像的宽度(以像素为单位) height: 图像的高度(以像素为单位) ...
    99+
    2024-04-02
  • PHP PDO教程:从基础到精通的进阶指南
    1. PDO简介 PDO是PHP的一个扩展库,它提供了一个面向对象的方式来操作数据库。PDO支持多种数据库,包括 MySQL、PostgreSQL、Oracle、SQL Server 等。PDO使开发人员能够使用统一的API来操作不同的...
    99+
    2024-02-13
    PHP PDO 数据库 连接 操作 查询 事务
  • C语言数据结构顺序表的进阶讲解
    目录前言一、顺序表的构造VS功能1.顺序表的构造2.接口实现(功能)二、功能具体分析1.初始化2.销毁3.检查size与capacity是否溢出4.尾增功能(实现)5.打印三、实现具...
    99+
    2024-04-02
  • SpringBoot2零基础到精通之数据库专项精讲
    目录1 数据库连接1.1 配置数据库连接信息1.2 整合Druid数据源2 SpringBoot整合MyBatis2.1 配置文件开发2.2 纯注解开发3 SpringBoot整合M...
    99+
    2024-04-02
  • 服务器容器化:从基础到精通的进阶指南
    1. 容器化基础 容器化是将应用程序及其所有依赖项打包到一个独立的执行环境中的过程。与虚拟机不同,容器共享主机操作系统的内核,从而实现更轻量、更便携。 Docker 概览 Docker 是一个流行的容器化平台。它使用一种称为 Docke...
    99+
    2024-03-06
    Docker、Kubernetes、容器化、云原生、容器编排
  • Java数据结构之顺序表篇
    目录一.线性表 二.顺序表1.概念及结构2.顺序表的实现打印顺序表获取顺序表的有效长度在pos位置新增元素判断是否包含某个元素查找某个元素对应的位置获取/查找pos位置的元...
    99+
    2024-04-02
  • Oracle数据类型解析:从基础到进阶
    Oracle数据类型解析:从基础到进阶 Oracle数据库是一款强大的关系型数据库管理系统,广泛应用于企业级应用程序开发和数据存储中。在Oracle数据库中,数据类型是非常重要的概念,...
    99+
    2024-03-07
    数据类型 oracle 进阶
  • SpringBoot2零基础到精通之数据与页面响应
    目录1 数据响应1.1 数据响应(JSON为例)1.2 数据响应之内容协商2 页面响应2.1 模板引擎之Thymeleaf2.2 拦截器2.3 文件上传1 数据响应  &...
    99+
    2024-04-02
  • java数据结构基础:顺序队列和循环队列
    目录队列:顺序队列:代码实现:循环队列:代码实现:总结队列: 队列是一种受限制的线性表 只允许在表的一端进行插入,另一端进行删除 插入的一端称作队尾,删除的一端称作队头 具有先进先出...
    99+
    2024-04-02
  • Java 精炼解读数据结构的顺序表如何操作
    目录前言一、什么是顺序表顺序表的概念及结构创建顺序表打印顺序表获取顺序表长度在pos位置新增元素判定是否包含某个元素查找某个元素对应的位置获取 pos 位置的元素给 pos 位置的元...
    99+
    2024-04-02
  • java数据结构基础:线性表
    目录前言需求分析编码add方法getIndex方法pop方法insert方法getAll全部代码总结前言 其实线性表在生活中和栈的结构差不多。昨天总结了一篇单链表,也是线性表的一种。...
    99+
    2024-04-02
  • HTML 有序列表:从基础到精通的实用指南
    什么是 HTML 有序列表? HTML 有序列表是一种允许您以特定顺序和样式显示项目的有用工具。有序列表中的项目通常使用数字、字母或罗马数字进行编号。 有序列表的格式及其元素 有序列表由 <ol> 标签和 <li>...
    99+
    2024-02-22
    HTML 有序列表 项目列表 编号列表
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作