Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数据结构---顺序表

数据结构---顺序表

作者头像
张小驰出没
发布于 2021-12-06 08:20:49
发布于 2021-12-06 08:20:49
54200
代码可运行
举报
运行总次数:0
代码可运行

顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存储线性表中的各个元素、使得线性表中再逻辑结构上响铃的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。

1.实现顺序表

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SequenceList<T>{
    //存储元素的数组
    private T[] list;
    //记录当前顺序表中的元素个数
    private int n;

    public SequenceList(int capacity) {
        //初始化数组
        this.list = (T[]) new Objects[capacity];
        //初始化长度
        this.n = 0;
    }

    //将一个线性表置为空表
    public void clear() {
        this.n = 0;
    }

    //判断当前线性表是否为空表
    public boolean isEmpty() {
        return n == 0;
    }

    //获取线性表的长度
    public int length() {
        return n;
    }

    //获取指定位置的元素
    public T get(int i) {
        return list[i];
    }

    //向线型表中添加元素t
    public void insert(T t) {
        list[n++] = t;
    }

    //在i元素处插入元素t
    public void insert(int i, T t) {
        //索引i之后的元素,依次向后移动
        for (int index = n; index > i; index--) {
            list[index] = list[index - 1];
        }
        // t 放到i索引处
        list[i] = t;
        //元素个数+1
        n++;
    }

    //删除指定位置i处的元素,并返回该元素
    public T remove(int i) {
        //删除的元素
        T current = list[i];
        //索引i之后的元素,依次前移
        for (int index = i; index < n - 1; index++) {
            list[index] = list[index + 1];
        }
        //元素个数-1
        n--;
        //返回删除元素
        return current;
    }

    //查找t元素第一次出现的位置
    public int indexOf(T t) {
        for (int i = 0; i < n; i++) {
            if (list[i].equals(t)) {
                return i;
            }
        }
        return -1;
    }
}

代码测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SequenceListTest {
    public static void main(String[] args) {
        //创建顺序表对象
        SequenceList<String> sl = new SequenceList<>(10);
        //测试插入
        sl.insert("test1");
        sl.insert("test2");
        sl.insert("test3");
        sl.insert(1,"test4");
        //测试获取
        String getResult = sl.get(1);
        System.out.println("获取索引1处的结果为:"+getResult);
        //测试删除
        String removeResult = sl.remove(0);
        System.out.println("删除的元素是:"+removeResult);
        //测试清空
        sl.clear();
        System.out.println("清空后的线性表中的元素个数为:"+sl.length());
    }
}

2.顺序表遍历

1.继承实现 Iterable 接口,重写 iterator 方法; 2.提供一个内部类 SIterator, 实现 Iterator 接口,重写 hasNext 方法和 next 方法

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SequenceList<T> implements Iterable<T> {
    
    // .....之前的代码
    
    //重写iterator方法
    @Override
    public Iterator<T> iterator() {
        return new SIterator();
    }
    //内部方法类,实现Iterator接口
    private class SIterator implements Iterator {
        private int cusor;
        //构造方法
        public SIterator() {
            this.cusor = 0;
        }
        //下一个是否存在
        @Override
        public boolean hasNext() {
            return cusor < n;
        }
        //指向下一个值
        @Override
        public Object next() {
            return list[cusor++];
        }
    }
}   

代码测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
    //创建顺序表对象
    SequenceList<String> sl = new SequenceList<>(10);
    //测试插入
    sl.insert("test1");
    sl.insert("test2");
    sl.insert("test3");
    sl.insert(1,"test4");
    for (String s : sl) {
        System.out.println(s);
    }
    System.out.println("-------------------------------");
    //测试获取
    String getResult = sl.get(1);
    System.out.println("获取索引1处的结果为:"+getResult);
    //测试删除
    String removeResult = sl.remove(0);
    System.out.println("删除的元素是:"+removeResult);
    //测试清空
    sl.clear();
    System.out.println("清空后的线性表中的元素个数为:"+sl.length());
}

3.顺序表容量可变

测试

  1. 创建一个容量为 2 的顺序表
  2. 在其中插入 3 个元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
    //创建顺序表对象
    SequenceList<String> sl = new SequenceList<>(2);
    //测试插入
    sl.insert("test1");
    sl.insert("test2");
    sl.insert("test3");
}

1.添加元素时: 添加元素时,应该检查当前数组的大小是否能容纳新的元素,如果不能容纳,则需要创建新的容量更大的数组,我们这里创建一个是原数组两倍容量的新数组存储元素。

2.移除元素时: 移除元素时,应该检查当前数组的大小是否太大,这样会造成内存空间的浪费,应该创建一个容量更小的数组存储元素。如果我们发现数据元素的数量不足数组容量的1/4,则创建一个是原数组容量的1/2的新数组存储元素。

代码实现

修改上述代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//根据参数newSize,重置eles的大小
public void resize(int newSize) {
    //定义临时数组,指向原数组
    T[] t = list;
    //创建新的数组
    list = (T[]) new Object[newSize];
    //拷贝数组数据
    for (int i = 0; i < n; i++) {
       list[i] = t[i];
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//向线型表中添加元素t
public void insert(T t) {
    //判断是否扩容
    if (n == list.length) {
        resize(2 * n);
    }
    list[n++] = t;
}
//在i元素处插入元素t
public void insert(int i, T t) {
    //判断是否扩容
    if (n == list.length) {
        resize(2 * n);
    }
    //索引i之后的元素,依次向后移动
    for (int index = n; index > i; index--) {
        list[index] = list[index - 1];
    }
    // t 放到i索引处
    list[i] = t;
    //元素个数+1
    n++;
}
//删除指定位置i处的元素,并返回该元素
public T remove(int i) {
    //删除的元素
    T current = list[i];
    //索引i之后的元素,依次前移
    for (int index = i; index < n - 1; index++) {
        list[index] = list[index + 1];
    }
    //元素个数-1
    n--;
    //元素个数小于1/4长度,容量缩小为1/2
    if (n < list.length / 4) {
        resize(list.length / 2);
    }
    //返回删除元素
    return current;
}

4.时间复杂度

  • get(i) : 不难看出,不论数据元素量N有多大,只需要一次查询就可以获取到对应的元素,所以时间复杂度为 O(1) ;
  • insert(int i,T t) : 每一次插入,都需要把 i 位置后面的元素移动一次,随着元素数量N的增大,移动的元素也越多,时间复杂为 O(n) ;
  • remove(int i) : 每一次删除,都需要把 i 位置后面的元素移动一次,随着数据量N的增大,移动的元素也越多,时间复杂度为 O(n) ;

由于顺序表的底层由数组实现,数组的长度是固定的,所以在操作的过程中涉及到了容器扩容操作。这样会导致顺序表在使用过程中的时间复杂度不是线性的,在某些需要扩容的结点处,耗时会突增,尤其是元素越多,这个问题越明显

个人博客为: MoYu’s HomePage

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线性表-关于顺序表的设计讲解
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序储存是指用一组地址连续的存储单元,一次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的数组元素存储在相邻的物理存储单元中,即通过数组元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。
吃猫的鱼Code
2023/02/26
4730
数据结构-链表
现虽然顺序表的查询很快,时间复杂度为 O(1) , 但是增删的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动。
张小驰出没
2022/04/14
2710
数据结构-链表
java数据结构之顺序表
2.顺序表中的在给定位置插入或者删除需要移动差不多一半的以上的元素,所以时间复杂度为O(n);
林老师带你学编程
2022/11/30
2860
Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚
在 Java 编程领域,线性表是一种极为基础且关键的数据结构,它犹如大厦的基石,支撑起众多复杂算法与程序功能的实现。线性表,从直观上理解,是由一系列具有相同类型的数据元素按照特定的顺序依次排列而成的集合,其元素之间存在着一对一的线性关系。 1.1线性表的基本特性: (一)有限性 线性表中的元素数量是有限的。无论是空表(不包含任何元素),还是包含大量元素的表,其元素个数总能确定。例如,一个班级的学生名单,无论班级规模大小,学生人数总归是可以明确统计的。 (二)有序性 元素在表中的排列具有确定的顺序。每个元素都有其特定的位置,除了第一个元素无前驱,最后一个元素无后继外,其他元素都有且仅有一个直接前驱和一个直接后继。就像电影院里的座位号,每个座位都有其固定的前后顺序。 (三)同一性 表中的所有元素都属于同一数据类型。这一特性使得对线性表的操作能够具有一致性和规范性。例如,一个存储整数的线性表,其中所有元素都为整型,这样在进行数学运算或数据比较等操作时就可以按照统一的整型规则进行。 1.2线性表在 Java 中的常见实现方式 存储结构 顺序表利用数组来存储线性表中的元素。在 Java 中,可以声明一个数组来容纳这些元素,例如 Object[] data(或指定具体类型如 int[] data 等)。数组在内存中是连续分配空间的,这使得顺序表在随机访问元素时具有极高的效率。通过元素的索引,可以直接计算出其在内存中的存储地址,从而快速获取到该元素,时间复杂度为 O(1)。 操作实现 插入操作:当向顺序表中插入一个元素时,如果插入位置不是在表尾,需要将插入位置之后的所有元素依次向后移动一位,为新元素腾出空间,然后再将新元素放入指定位置。这种移动操作在元素数量较多时可能会耗费较多时间,平均时间复杂度为O(n) ,其中 为线性表的长度。例如,在一个长度为 100 的顺序表中,如果要在第 50 个位置插入一个元素,就需要将第 50 个到第 100 个元素向后移动一位。 删除操作:类似地,删除操作如果不是删除表尾元素,需要将删除位置之后的元素依次向前移动一位,以填补删除元素后留下的空位。其平均时间复杂度也为O(n) 。比如删除一个长度为 80 的顺序表中的第 30 个元素,就需要将第 31 个到第 80 个元素向前移动一位。 查询操作:由于可以直接通过索引访问数组元素,所以查询指定位置元素的时间复杂度为O(1) 。而查询某个特定值的元素时,可能需要遍历整个顺序表,在最坏情况下时间复杂度为O(n) 。例如,在一个存储学生成绩的顺序表中,如果要查找成绩为 90 分的学生,可能需要逐个比较所有学生的成绩。 二:顺序表
学无止尽5
2024/11/29
840
Java ArrayList 与顺序表:在编程海洋中把握数据结构的关键之锚
数据结构于算法—线性表详解(顺序表、链表)
下面用一个图来浅析线性表的关系。可能有些不太确切,但是其中可以参考,并且后面也会根据这个图举例。
bigsai
2019/09/24
6220
数据结构于算法—线性表详解(顺序表、链表)
python数据结构之线性顺序表
线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。本文结合了互联网上的一些代码,以及结合百度百科关于线性顺序表的定义,实现了全部代码。
python与大数据分析
2022/03/11
3900
python数据结构之线性顺序表
数据结构——顺序表
今天我们来进入数据结构的下一节——顺序表,在正式开始说顺序表之前,我们首先需要知道线性表的概念!
用户11352420
2024/11/07
700
数据结构——顺序表
【数据结构】顺序表
前言: 小编在开始之前就已经发了顺序表的相关用例,想看的小伙伴可以去看看哦http://t.csdnimg.cn/saIbn
用户11288949
2024/09/24
610
【数据结构】顺序表
知识改变命运 数据结构【顺序表】
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。
用户11319080
2024/10/17
860
知识改变命运 数据结构【顺序表】
数据结构-2.顺序表
线性是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表有: 顺序表 , 链表 , 栈 , 队列...
用户11369350
2024/11/19
370
数据结构-2.顺序表
数据结构02 线性表之顺序表
这篇文章主要总结线性表之顺序表的相关操作,主要分以下几个部分来总结。 1、线性表是什么?  2、线性表的两种存储结构?  3、顺序表的存储结构表示?   4、顺序表的常见操作和代码实现? 1、线性表是什么  (1)线性表是最基本、最简单的一种数据结构。 (2)线性表中元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。 (3)如果是一对多就用树来表示,如果多对多就用网状来表示。 (4)线性表具有以下几个特征:   ①有且只有一个“首”元素    ②有且只有一个“尾”
nnngu
2018/03/15
7280
数据结构02 线性表之顺序表
【数据结构】ArrayList与顺序表
---- 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。 2.顺序表 2.1接口的实现 我们先自己来完成一个顺序表8:  具体效果如图: 源码如下: 建议小伙伴们自己思考一下上手敲一敲代码,对后续的学习可以更好的理解哟~ MyArr
xxxflower
2023/04/16
1890
【数据结构】ArrayList与顺序表
《Java初阶数据结构》----2.<线性表---ArrayList与顺序表>
2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
用户11288958
2024/09/24
700
《Java初阶数据结构》----2.<线性表---ArrayList与顺序表>
【数据结构】——顺序表
常见的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、学历等
星辰与你
2024/10/17
890
【数据结构】——顺序表
数据结构之顺序表(C语言版)
GG Bond1
2024/06/14
1310
【数据结构】顺序表
线性表( linear list )是n个具有相同特性的数据元素的有限序列。简单来说是具有相同特性的数据结构的集合, 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
用户11290673
2024/09/25
1030
【数据结构】顺序表
数据结构【顺序表】
线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的 数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串...
逆向-落叶
2024/10/28
1300
数据结构【顺序表】
【数据结构】顺序表
线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构. 常见的线性表有:顺序表 链表 栈 队列 字符串... 线性表在逻辑上是线性结构,也就是连续的一条直线,但是在物理结构上并不一定是连续的. 线性表在物理上存储时,通常以数组和链式结构的形式存储. 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改. 顺序表一般可以分为: 静态顺序表:使用定长数组存储元素. 
IT编程爱好者
2023/04/12
5250
【数据结构】顺序表
【数据结构】顺序表
本篇文章将详细介绍顺序表的基本搭建过程。 我们都知道顺序表的底层其实就是数组,但是既然有了数组为什么还要有顺序表呢? 其实相比如数组,顺序表还是有很多优势的。比如动态扩容、增删查改效率高、支持动态元素类型、停供更多的操作方法等。顺序表相对于数组具有更高的灵活性和功能性,可以更方便地对数据进行操作和管理。
_小羊_
2024/10/16
700
【数据结构】顺序表
数据结构之顺序表(超详解)
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
egoist祈
2025/01/23
1150
数据结构之顺序表(超详解)
相关推荐
线性表-关于顺序表的设计讲解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验