【数据结构与算法】3.顺序表

news2024/9/24 15:28:10

在这里插入图片描述

📚博客主页:爱敲代码的小杨.

✨专栏:《Java SE语法》

❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️

🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!


文章目录

  • 1.线性表
  • 2. 顺序表
    • 2.1 顺序表结构
    • 2.2 实现顺序表接口
    • 2.3 打印顺序表
    • 2.2 实现新增元素
    • 2.3 实现查找元素
    • 2.3 获取指定位置的值
    • 2.4 删除元素
    • 2.5 获取顺序表的长度
    • 2.6 清空顺序表
  • 3.代码

1.线性表

定义:线性表是 n 个具有相同特性的数据元素的有序序列。线性表是一种在实际中广泛使用的数据结构,常用的线性表:顺序表、链表、栈、队列…

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

image-20231213190401568

2. 顺序表

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

2.1 顺序表结构

代码实现:

public class MyArrayList implements IList{

    public int[] elem;
    public int usedSize; // 记录数组元素个数
    public static final int DEFAULT_CAACITY = 5; // 默认容量

    public MyArrayList() {
        elem = new int[DEFAULT_CAACITY];
    }
}

2.2 实现顺序表接口

代码实现:

public interface IList {
    // 新增元素,默认在数组最后新增
    public void add(int data);

    // 在 pos 位置新增元素
    public void add(int pos, int data);

    // 判定是否包含某个元素
    public boolean contains(int toFind);

    // 查找某个元素对应的位置
    public int indexOf(int toFind);

    // 获取 pos 位置的元素
    public int get(int pos);

    // 给 pos 位置的元素设为 value
    public void set(int pos, int value);

    //删除第一次出现的关键字key
    public void remove(int toRemove);

    // 获取顺序表长度
     public int size();

     // 清空顺序表
    public void clear();

    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display();

    // 判断数组是否存满元素
    public boolean isFull();
    
    // 判断数组是否为空
    public boolean isEmpty();
}

2.3 打印顺序表

代码实现:

	/**
     * 打印顺序表的所有的元素
     */
    @Override
    public void display() {
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i] + " ");
        }
        System.out.println();
    }

2.2 实现新增元素

新增元素思想:

  1. 判断数组是否存满元素,如果存满则增加容量,否则存储在elem[usedSize]位置
  2. 判断pos位置是否合法,则抛出异常
  3. 从最后一个元素开始先前遍历到pos位置,分别将它们都向后移动一个位置,再将元素存放到pos位置

代码实现:

	/***
     * 添加元素,默认添加到数组的最后位置
     * @param data
     */
    @Override
    public void add(int data) {
        // 1.判断是否满了 满了就要扩容
        if (isFull()) {
            expansion();
        }
        elem[usedSize] = data;
        usedSize++;
    }

    /***
     * 给pos位置添加元素data
     * 从后往前移动元素 再将元素放进数组
     * @param pos
     * @param data
     */
    @Override
    public void add(int pos, int data) {
        checkPosOfAdd(pos);
        if (isFull()) {
            expansion();
        }
        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i + 1] = elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }

    /***
     * 判断数组是否存满
     * @return
     */
    @Override
    public boolean isFull() {
        return usedSize == elem.length;
    }

    /**
     * 扩容数组
     */
    public void expansion() {
        elem = Arrays.copyOf(elem, 2 * elem.length);
    }

    /**
     * 判断pos位置是否合法
     * @param pos
     */
    private void checkPosOfAdd(int pos) {
        if (pos < 0 || pos > usedSize) {
            throw new PosException("pos位置:" + pos);
        }
    }

异常类:

public class PosException extends RuntimeException {
    public PosException() {

    }

    public PosException(String msg) {
        super(msg);
    }
}

2.3 实现查找元素

代码实现:

	/***
     * 查找当前元素,是否存在
     * @param toFind
     * @return
     */
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (toFind == elem[i]) {
                return true;
            }
        }
        return false;
    }

    /***
     * 查找当前元素,并返回下标
     * @param toFind
     * @return
     */
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (toFind == elem[i]) {
                return i;
            }
        }
        return -1;
    }

2.3 获取指定位置的值

思路:

  1. 判断pos位置是否合法,则抛出异常
  2. 判断数组是否为空,否则抛出异常
  3. 返回elem[pos]的值

代码实现:

	/***
     * 获取pos位置的值
     * @param pos
     * @return
     */
    @Override
    public int get(int pos) {
        // 1.判断pos是否合法
        checkPosOfGet(pos);

        // 2.判断数组是否为空
        if (isEmpty()) {
            throw new EmptyException("顺序表为空");
        }

        return elem[pos];
    }

     /**
     * 判断pos是否合法
     * @param pos
     */
    private void checkPosOfGet(int pos) {
        if (pos < 0 || pos >= usedSize) {
            throw new PosException("pos位置:" + pos);
        }
    }

    /***
     * 判断数组是否为空
     * @return
     */
    @Override
    public boolean isEmpty() {
        return usedSize == 0;
    }

异常类:

public class EmptyException extends  RuntimeException {
    public EmptyException() {

    }

    public EmptyException(String msg) {
        super(msg);
    }
}

2.4 删除元素

思路:

  1. 判断顺序表是否为空,如果为空抛出异常
  2. 查找要删除的元素
  3. 从删除元素的下标遍历到usedSize - 1位置,分别将后一个元素移动到前几个位置。

代码实现:

	/***
     * 删除toRemove这个数字
     * @param toRemove
     */
    @Override
    public void remove(int toRemove) {
        // 1.判断数组是否为空
        if (isEmpty()) {
            throw new EmptyException("顺序表为空,不能删除");
        }
        int index = indexOf(toRemove);
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] = elem[i + 1];
        }
        usedSize--;
    }

2.5 获取顺序表的长度

思路:顺序表的长度就等于usedSize的值

	/***
     * 获取顺序表的长度
     * @return
     */
    @Override
    public int size() {
        return this.usedSize;
    }

2.6 清空顺序表

思路:将usedSize的值置为空

	/***
     * 清空顺序表 防止内存泄漏
     */
    @Override
    public void clear() {
        usedSize = 0;
    }

3.代码

代码链接🔗

在这里插入图片描述

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

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

相关文章

Unity 建造者模式(实例详解)

文章目录 说明实例1&#xff1a;构建游戏角色实例2&#xff1a;构建游戏场景实例3&#xff1a;构建UI界面 说明 在Unity中&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过分离对象构建过程的复杂性&#xff0c;允许您以…

钡铼新品 BL120 Modbus工业协议转换网关

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 钡铼…

【吃灰开发板复活】DIY全志V3s随身终端屏幕适配,LVGL以及各种外设驱动移植教程

在上周的文章中介绍了一款因作者想要学习Linux而动手DIY的终端设备V3S-PI&#xff0c; 《梦回2004&#xff01;我用全志V3s做了个成本100元&#xff0c;功能媲美MP4的随身终端》&#xff1a;梦回2004&#xff01;我用全志V3s做了个成本100元&#xff0c;功能媲美MP4的随身终端…

为什么电脑降价了?

周末&#xff0c;非常意外地用不到3000元买到了一款2023年度发布的华为笔记本I5,16G,500G&#xff0c;基本是主流配置&#xff0c;我非常意外&#xff0c;看了又看&#xff0c;不是什么Hwawii&#xff0c;或者Huuawe。然后也不是二手。为什么呢&#xff1f;因为在ALU和FPU之外&…

JAVA:OFD Reader Writer 开源库技术解析

1、简述 OFD Reader & Writer 是一个由开源社区推动的 OFD 文件处理库&#xff0c;它旨在提供对 OFD 格式文件的读取和写入功能。这一开源项目为开发者提供了强大而灵活的工具&#xff0c;使得在应用程序中处理和生成 OFD 文件变得更加容易和高效 开源地址&#xff1a;htt…

Flutter底部导航栏插件persistent_bottom_nav_bar的使用

flutter 框架中的 persistent_bottom_nav_bar 插件可以让我们快速实现页面底部导航栏&#xff08;也就是 bottomNavigationBar &#xff09;的布局且能拥有多样的切换效果&#xff08;包括但不限于&#xff1a;动画切换效果、中间凸起按钮效果等&#xff09; 插件网址&#xf…

网络安全全栈培训笔记(55-服务攻防-数据库安全RedisHadoopMysqla未授权访问RCE)

第54天 服务攻防-数据库安全&Redis&Hadoop&Mysqla&未授权访问&RCE 知识点&#xff1a; 1、服务攻防数据库类型安全 2、Redis&Hadoop&Mysql安全 3、Mysql-CVE-2012-2122漏洞 4、Hadoop-配置不当未授权三重奏&RCE漏洞 3、Redis-配置不当未授权…

linux更新内核

内核介绍 官网链接:https://kernel.org 内核下载库: https://mirrors.edge.kernel.org/pub/linux/kernel/ 更新软件源 rootcary:~# apt-get update rootcary:~# sudo apt-get install libncurses5-dev build-essential kernel-package flex bison libelf-dev libssl-dev 下…

通过curl访问k8s集群获取证书或token的方式

K8S安全控制框架主要由下面3个阶段进行控制&#xff0c;每一个阶段都支持插件方式&#xff0c;通过API Server配置来启用插件。 1. Authentication&#xff08;认证&#xff09; 2. Authorization&#xff08;授权&#xff09; 3. Admission Control&#xff08;准入控制&#…

数字频率合成器dds的量化性能分析matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 DDS的基本原理 4.2 DDS的量化性能分析 5.完整工程文件 1.课题概述 数字频率合成器dds的量化性能分析matlab仿真&#xff0c;分别定义累加器位宽&#xff0c;截位位宽&#xff0c;模拟DAC位宽等&…

excel学习1

直接ctrl cctrl v会报错位移选择粘贴时用123那个数字粘贴而不是ctrl V 只要结果不要公式 上面复制的为数值这里是复制的公式他们两个不一样 这个方法太麻烦了直接用格式刷&#xff0c;选择一个区域一个单元格&#xff0c;不要选择多个一刷就出来了 第一个计算后向下拖就行了&…

开发实践8_REST

一、Django REST Framework, Django View & APIView MTV模式实现前后端分离。Representational State Transfer 表现层状态转化。Representation 资源&#xff08;Resource a specific info. on net.&#xff09;具体呈现形式。ST 修改服务端的数据。修改数据 POST请求。…

【AI Agent系列】【MetaGPT】7. 一句话订阅专属信息 - 订阅智能体进阶,实现一个更通用的订阅智能体

文章目录 0. 前置推荐阅读1. 本文内容2. 解析用户指令&#xff08;分析用户需求&#xff09;2.1 完整代码及注释2.2 运行结果 3. 利用大模型写爬虫代码3.1 对html内容进行精简3.2 利用大模型写爬虫代码3.3 补充代码&#xff0c;测试本节程序3.4 运行结果及踩坑3.4.1 运行结果3.…

开始学习vue2基础篇(指令)

一、 内容渲染指令 > {{}} 模板渲染&#xff08;模板引擎&#xff09; 1. {{数据绑定}} 2. {{简单计算}} 3. {{简单逻辑运算}}&#xff08;三元运算&#xff09; 4. {{做简单 js 判断}} 注意&#xff1a;不能写语句、不能解析 html 渲染、不能放在在属性身上 > v-…

40. 组合总和 II - 力扣(LeetCode)

题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 输入示例 candidates [10,1,2,7,…

如何使用WinSCP公网远程访问本地CentOS服务器编辑上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

Kubernetes operator(一)client-go篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第一篇&#xff0c;主要对client-go进行学习&#xff0c;从源码阅读角度&#xff0c;学习client-go各个组件的实现原理、如何协同工作等参考视频&#xff1a;Bilibili 2022年最新k…

【MySQL进阶】锁

文章目录 锁概述全局锁语法特点 表级锁表锁意向锁 行级锁行锁间隙锁&临键锁 面试了解数据库的锁吗&#xff1f;介绍一下间隙锁InnoDB中行级锁是怎么实现的&#xff1f;数据库在什么情况下会发生死锁&#xff1f;说说数据库死锁的解决办法 锁 概述 锁机制&#xff1a;数据库…

2 - 部署Redis集群架构

部署Redis集群架构 部署Redis集群部署管理主机第一步 准备ruby脚本的运行环境第二步 创建脚本第三步 查看脚本帮助信息 配置6台Redis服务器第一步 修改配置文件启用集群功能第二步 重启redis服务第三步 查看Redis-server进程状态&#xff08;看到服务使用2个端口号为成功&#…

Java线程池七大参数详解和配置(面试重点)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…