【数据结构】顺序表的原理及实现

news2024/11/25 6:59:33

1.什么是顺序表

  • 顺序表是用一段物理地址连续的存储单元进行存储元素的线性结构,通常是以数组进行存储。
  • 通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。

在这里插入图片描述

2.顺序表的实现

判断顺序表是否为空表public boolean isEmpty()
判断顺序表是否满public boolean ifFull()
向顺序表中添加元素public void add(T ele)
删除指定位置的元素public void delete(int index)
删除指定的元素public void remove(T ele)
在指定的位置添加元素public void add(int index,T ele)
修改数据public void update(int index,T ele)
获取顺序表的长度public int size()
获取对应位置的元素public T getIndex(int index)
遍历输出顺序表public void show()

在这里插入图片描述
(1)顺序表定义

在这里插入图片描述

(2)判断集合是否为满

在这里插入图片描述

(3)判断集合是否为空

在这里插入图片描述

(4)遍历顺序表元素

在这里插入图片描述

(5)向顺序表中添加元素

在这里插入图片描述

(6)获取元素的下标索引

在这里插入图片描述

(7)向顺序表中删除指定元素

在这里插入图片描述

(8)修改指定下标元素

在这里插入图片描述

(9)获取有效元素个数

在这里插入图片描述

(10)顺序表扩容

在这里插入图片描述

# 修改add方法中判断元素是否已经满了的逻辑
# 如果元素已经满了,则进行扩容原长度的2倍
# 同时修改容量的大小
if(isFull()){
    this.size = list.length*2;
    reList(this.size);
}

(11)获取顺序表的最大容量

在这里插入图片描述

3.顺序表功能验证

(1)整体顺序表实现代码

/**
 * @description 顺序表数据结构实现
 * @author lixiang
 * @param <T>
 */
public class SequenceList<T> {

    /**
     * 定义默认的数组长度
     */
    private final static int DEFAULT_SIZE = 10;

    /**
     * 定义存储数组
     */
    private T[] list;

    /**
     * 定义顺序表的有效元素个数
     */
    private int num;

    /**
     * 定义数组的长度
     */
    private int size;

    /**
     * 无参构造方法,默认长度10
     */
    public SequenceList(){
        list = (T[]) new Object[DEFAULT_SIZE];
        this.size = DEFAULT_SIZE;
        this.num=0;
    }

    /**
     * 有参构造,长度为size
     * @param size
     */
    public SequenceList(int size){
        list = (T[]) new Object[size];
        this.size = size;
        this.num=0;
    }

    /**
     * 顺序表的判空实现
     * @return
     */
    public boolean isEmpty(){
        return num==0;
    }

    /**
     * 顺序表的判满实现
     * @return
     */
    public boolean isFull(){
        return num==list.length;
    }

    /**
     * 顺序表的遍历
     */
    public void showNum(){
        for(int i=0;i<num;i++){
            System.out.println(list[i]);
        }
    }

    /**
     * 顺序表添加元素,添加到指定的下标下
     * @param index
     * @param ele
     */
    public void add(int index,T ele){
        if(isFull()){
            //这块后续会加上扩容的方法
            this.size = list.length*2;
            reList(this.size);
        }
        //如果index 为 -1 表示直接插入末尾
        if(index == -1){
            list[num++]=ele;
            return;
        }
        //不为-1的话,则插入到指定的下标
        if(index<0 || index>num){
            System.out.println("参数不合法");
        }
        //把i的位置腾出来 i位置的元素全部向后移动一位
        if (num - index >= 0) System.arraycopy(list, index, list, index + 1, num - index);
        //直接插入元素
        list[index]=ele;
        num++;
    }

    /**
     * 顺序表添加元素,添加到末尾
     * @param ele
     */
    public void add(T ele){
        this.add(-1,ele);
    }

    /**
     * 删除指定位置的元素
     * @param ele
     */
    public void delete(int index){
        if(index <0 || index>num){
            System.out.println("参数不合法");
        }
        //把每个元素向前移动一位
        if (num - (index + 1) >= 0) System.arraycopy(list, index + 1, list, index + 1 - 1, num - (index + 1));
        num--;
    }

    /**
     * 删除指定元素
     * @param ele
     */
    public void remove(T ele){
        //获取元素下标索引
        int index = this.indexOf(ele);
        if(index == -1){
            System.out.println("当前元素不存在:"+ele);
        }
        //删除元素
        this.delete(index);
    }

    /**
     * 获取元素的下标索引
     * @param ele
     * @return
     */
    public int indexOf(T ele){
        for (int i = 0; i < list.length; i++) {
            if(list[i].equals(ele)){
                return i;
            }
        }
        return -1;
    }

    /**
     * 修改指定下标元素
     * @param index
     * @param ele
     */
    public void update(int index,T ele){
        list[index]=ele;
    }

    /**
     * 获取元素个数
     * @return
     */
    public int getNum(){
        return num;
    }

    /**
     * 扩充顺序表容量
     * 私有方法,不对外提供,在插入元素时,判断是否已经满的情况下调用
     * 如果顺序表的元素已经满了,则调用扩容方法
     * @param size
     */
    private void reList(int size){
        //保存之前的顺序表
        T []temp=list;
        //创建新的顺序表
        list = (T[]) new Object[size];
        //拷贝元素
        System.arraycopy(temp, 0, list, 0, temp.length);
    }

    /**
     * 返回顺序表容量大小
     * @return
     */
    public int size(){
        return size;
    }

}

(2)验证顺序表初始化

public class Main {
    public static void main(String[] args) {
        SequenceList<Integer> sequenceDefaultSizeList = new SequenceList<>();
        SequenceList<Integer> sequenceCustomSizeList = new SequenceList<>(5);
        System.out.println("默认定义顺序表容量大小:"+sequenceDefaultSizeList.size());
        System.out.println("自定义顺序表容量大小:"+sequenceCustomSizeList.size());
    }
}

在这里插入图片描述

(2)验证添加元素

public class Main {
    public static void main(String[] args) {
        SequenceList<Integer> sequenceDefaultSizeList = new SequenceList<>();
        //添加1 2 3 元素
        sequenceDefaultSizeList.add(1);
        sequenceDefaultSizeList.add(2);
        sequenceDefaultSizeList.add(3);
        //输出
        sequenceDefaultSizeList.show();
    }
}

在这里插入图片描述

(3)验证修改元素

public class Main {
    public static void main(String[] args) {
        SequenceList<Integer> sequenceDefaultSizeList = new SequenceList<>();
        //添加1 2 3 元素
        sequenceDefaultSizeList.add(1);
        sequenceDefaultSizeList.add(2);
        sequenceDefaultSizeList.add(3);
        //输出
        sequenceDefaultSizeList.show();

        sequenceDefaultSizeList.update(0,9);
        sequenceDefaultSizeList.show();
    }
}

在这里插入图片描述

(4)验证删除元素

public class Main {
    public static void main(String[] args) {
        SequenceList<Integer> sequenceDefaultSizeList = new SequenceList<>();
        //添加1 2 3 元素
        sequenceDefaultSizeList.add(1);
        sequenceDefaultSizeList.add(2);
        sequenceDefaultSizeList.add(3);
        //输出
        sequenceDefaultSizeList.show();

        sequenceDefaultSizeList.delete(0);
        sequenceDefaultSizeList.show();
    }
}

在这里插入图片描述

(5)验证集合扩容

public class Main {
    public static void main(String[] args) {
        SequenceList<Integer> sequenceDefaultSizeList = new SequenceList<>(2);
        System.out.println("扩容前:"+sequenceDefaultSizeList.size());
        //添加1 2 3 元素
        sequenceDefaultSizeList.add(1);
        sequenceDefaultSizeList.add(2);
        sequenceDefaultSizeList.add(3);
        //输出
        System.out.println("扩容后:"+sequenceDefaultSizeList.size());
    }
}

在这里插入图片描述

(6)验证获取元素的下标索引

public class Main {
    public static void main(String[] args) {
        SequenceList<Integer> sequenceDefaultSizeList = new SequenceList<>(2);//添加1 2 3 元素
        sequenceDefaultSizeList.add(1);
        sequenceDefaultSizeList.add(2);
        //输出
        System.out.println("元素index:"+sequenceDefaultSizeList.indexOf(2));
    }
}

在这里插入图片描述

(7)获取当前集合有效元素个数

public class Main {
    public static void main(String[] args) {
        SequenceList<Integer> sequenceDefaultSizeList = new SequenceList<>(4);//添加1 2 3 元素
        sequenceDefaultSizeList.add(1);
        sequenceDefaultSizeList.add(2);
        //输出
        System.out.println("当前集合有效元素个数为:"+sequenceDefaultSizeList.getNum());
    }
}

在这里插入图片描述

4.顺序表的优缺点

  • 优点:
    • 按照索引查询元素速度快
    • 按照索引遍历数组方便
    • 可以随机访问其中的元素
  • 缺点:
    • 根据内容查找元素速度慢,需遍历全部集合
    • 数组的大小一经确定不能改变,不适合动态存储,手动扩容
    • 增加、删除元素效率慢

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

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

相关文章

复旦MBA海外短期课程 | 善用ESG金融,共创可持续未来

2022年&#xff0c;世界在颠簸中向前迈进&#xff1a;全球气候变化、能源危机、大国博弈……在这样的背景下&#xff0c;近年来备受瞩目的ESG价值、“双碳”目标、可持续发展、责任投资等话题愈发成为焦点。今年复旦MBA培养体系全面升级之际&#xff0c;在新增的“未来发展模块…

Pandas CSV 文件

Pandas CSV 文件CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。CSV 是一种通用的、相对…

【沐风老师】3dMax一键生成中央空调排风口插件使用教程

3dMax一键创建中央空调排风口插件&#xff0c;快捷生成矩形或菱形两种形状的排风口。 【版本要求】 不确定。3dmax2020环境测试可用&#xff0c;其他版本自行测试&#xff0c;欢迎反馈测试结果。 【安装方法】 方法一&#xff1a;拖动插件文件到3dMax窗口打开。 方法二&#x…

ESP32相关知识点

1.vs code代码回退到上一步: 方法1:在Windows中可以使用快捷键“Alt←”实现 方法2:利用vs code界面操作&#xff0c;Go-Back 2.设置vs code下ESP-IDF Monitor Device的波特率。 步骤Manage-New Code update available------Command Palette 弹出对话框 搜索或选择:ESP-IDF:SD…

基于Androidstudio的打车拼车app

需求信息&#xff1a; 客户端&#xff1a; 1&#xff1a;注册和登录:用户信息录入与登录。 2&#xff1a;修改密码:用户忘记密码可在此处找回。 3&#xff1a;地图功能:提供城市地图&#xff0c;能被自由移动、放大和缩小。 4&#xff1a;自身定位:获取用户位置信息&#xff0c…

STM-PWM采集

输入捕获分为两种方式进行捕获 1、pwm输入捕获:精度高&#xff0c;每个定时器只能采集一个pwm&#xff0c;且只能使用通道1、通道2。 2、通用输入捕获&#xff1a;相对比较精确&#xff0c;每个定时器可以采集多个pwm&#xff0c; 1、pwm输入捕获使用教程如下&#xff1a; 参…

Vue 快速入门(一)

1、介绍 Vue(读音/vju/&#xff0c;类似view)&#xff0c;是中国的大神尤雨溪开发的&#xff0c;为数不多的国人开发的世界顶级开源软件。是一套用于构建用户界面的渐进式框架&#xff0c;Vue 被设计为可以自底向上逐层应用。MVVM响应式编程模型&#xff0c;避免直接操作DOM&am…

虹科分享 | HPC调度解决方案:HK-Adaptive在数字卫星图像领域的应用

2011年3月11日&#xff0c;日本海岸附近发生了9.0级地震。这次地震引发了强大的海啸&#xff0c;并向内陆传播了6英里&#xff0c;不仅使地球的轴心偏移了大约10到25厘米&#xff0c;还导致福岛核电站发生核紧急情况。 为了减少这场灾害的损失&#xff0c;不同国家的不同组织以…

浅谈虚拟电厂与企业微电网数字化建设

安科瑞 华楠摘要&#xff1a;2023年1月8日&#xff0c;微信公众号鱼眼看电改(作者俞庆)发表了文章《虚拟电厂与负荷侧数字化》&#xff0c;原文如下&#xff1a;“虚拟电厂是电力数字化的一个应用方向&#xff0c;准确的说&#xff0c;是负荷侧数字化的发展方向。所以负荷侧数字…

NetSuite Classifications的注意事项

Classifications&#xff0c;我们将之称为“分析维度”吧&#xff0c;这样更能体现其真正的用途。在NetSuite中标准的分析维度是“LDC&#xff08;Location、Department、Class&#xff09;”&#xff0c;这是NetSuite的特色。有些注意事项我们今天分享下。 1. LDC的用途区别 …

Django REST framework--Swagger API文档生成器

Django REST framework--Swagger API文档生成器swagger在线接口文档drf-yasg安装与配置安装drf-yasg配置drf-yasg互动模式文档模式定制化用法&#xff08;viewset模式&#xff09;修饰视图装饰器api_view修饰视图集swagger在线接口文档 目前为止&#xff0c;接口开发到了一定的…

Spring AOP【统一异常处理与统一数据格式封装】

Spring AOP【统一异常处理与统一格式封装】&#x1f34e;一.统一异常处理&#x1f352;1.1 实现一个异常方法&#x1f352;1.2 统一处理异常代码的实现&#x1f352;1.3 统一处理所有异常&#x1f34e;二.统一格式封装&#x1f352;2.1 实现一个返回数据方法&#x1f352;2.2 统…

回收租赁商城系统功能拆解09讲-会员管理

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…

echarts省市区id(区域编码)实现地图下钻点击(data赋值自定义属性值,geojson信息获取)

致新的一年&#xff1a;不知不觉已经是2023年&#xff0c;祝新的一年大展宏图&#xff08;兔&#xff09;&#xff0c;前途&#xff08;兔&#xff09;似锦&#xff0c;今年梦想实现&#xff01; 正文&#xff1a; 接触echarts也有很长一段时间了&#xff0c;最近有个很常见的…

UE4 反射 学习笔记

想让类具有反射机制&#xff0c;必须要有这四个要素&#xff1a; 1、generated.h文件 2、UCLASS()宏 3、继承自UObject 4、GENERATED_BODY() void ABlurCharacter::BeginPlay() {Super::BeginPlay();ABlurCharacter *BlurCharacter NewObject<ABlurCharacter>();UCl…

直线检测算法汇总分析

直线检测算法汇总 1、场景需求 在计算机视觉领域&#xff0c;我们经常需要做一些特殊的任务&#xff0c;而这些任务中经常会用到直线检测算法&#xff0c;比如车道线检测、长度测量等。尽管直线检测的任务看起来比较简单&#xff0c;但是在具体的应用过程中&#xff0c;你会发…

MySQL50题

四张表&#xff1a; 1.学生表 Student&#xff08;s_id,s_name,s_birth,s_sex) 2.课程表Course(c_id,c_name,t_id) 3.教师表Teacher&#xff08;t_id&#xff0c;t_name) 4.成绩表Score(s_id,c_id,s_score) 建表语句&#xff1a; 创建学生表并且往表中插入语句 CREATE TABL…

如何下载通达信接口 费用如何?

之前我分享了自编的一些通达信指标公式。经粉丝咨询&#xff0c;我发现自己疏忽了一个问题&#xff1a;许多人不知道如何下载/使用通达信接口软件&#xff01; 通达信软件PC版&#xff0c;有以下两种形态&#xff1a; 第一种形态是官方版。 官方版的软件下载链接在这里&…

C语言—文件操作(学好文件操作,再也不用担心数据丢失)

专栏&#xff1a;C语言 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些C语言的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 文件操作前言一、为什么使用文件二、什么是文件1.…

Leetcode:538. 把二叉搜索树转换为累加树(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 反中序遍历法&#xff1a; 原理思路&#xff1a; 迭代&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&…