数据结构(Java实现):顺序表

目录

  • 1. 线性表
  • 2.顺序表
    • 2.1自己实现一个List接口
    • 2.2 IList接口的实现
    • 2.3 测试代码

1. 线性表

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

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

2.顺序表

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

2.1自己实现一个List接口

public interface IList {
    // 新增元素,默认在数组最后新增
    void add(int data);
    // 在 pos 位置新增元素
    void add(int pos, int data);
    // 判定是否包含某个元素
    boolean contains(int toFind);
    // 查找某个元素对应的位置
    int indexOf(int toFind);
    // 获取 pos 位置的元素
    int get(int pos);
    // 给 pos 位置的元素设为 value -> 更新
    void set(int pos, int value);
    //删除第一次出现的关键字key
    void remove(int toRemove);
    //删除所有关键字key
    public void removeAll(int toRemove);
    // 获取顺序表长度
    int size();
    // 清空顺序表
    void clear();
    // 打印顺序表,
    // 注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    void display();
    //判断线性表是否满了
    boolean isFull();
}

2.2 IList接口的实现

下面是具体实现的代码

public class MyArray implements IList{
    public int[] values1;//存储具体值
    public int usedSize;//线性表中数据个数
    public MyArray(){
        usedSize=0;
        values1=new int[10];
    }
    //判满
    public boolean isFull(){
        return usedSize == values1.length;
    }
    //尾插
    @Override
    public void add(int data) {
        if(isFull()){
            values1= Arrays.copyOf(values1,usedSize*2);
        }
        values1[usedSize]=data;
        usedSize++;
    }
//判断指定位置插入数据的这个指定位置是否合法
    private void posLegal(int pos)throws PosIllegalException{
        if(pos<0||pos>usedSize){
            throw new PosIllegalException();
        }
    }
    //指定位置插入数据
    @Override
    public void add(int pos, int data) {
        if(isFull()){
            values1= Arrays.copyOf(values1,usedSize*2);
        }
        try {
            posLegal(pos);
        }catch (PosIllegalException e){
            e.printStackTrace();
        }
        for (int i=usedSize;i>pos;i--){
            values1[i]=values1[i-1];
        }
        values1[pos]=data;
        usedSize++;
    }
    //是否存在目标值
    @Override
    public boolean contains(int toFind) {
        for(int i=0;i<usedSize;i++){
            if(toFind==values1[i]){
                return true;
            }
        }
        return false;
    }
    //返回需要找到值的下标
    @Override
    public int indexOf(int toFind) {
        for(int i=0;i<usedSize;i++){
            if(toFind==values1[i]){
                return i;
            }
        }
        return -1;
    }
    //判断获取指定下标值或者修改指定位置的值的指定位置是否合法
    private void posLegal1(int pos)throws PosIllegalException{
        if(pos<0||pos>=usedSize){
            throw new PosIllegalException();
        }
    }
    //获取指定下标的值
    @Override
    public int get(int pos) {
        try {
            posLegal1(pos);
        }catch (PosIllegalException e){
            e.printStackTrace();
        }
        return values1[pos];
    }
    //修改指定下标的值
    @Override
    public void set(int pos, int value) {
        try {
            posLegal(pos);
        }catch (PosIllegalException e){
            e.printStackTrace();
        }
        values1[pos]=value;
    }
    //移除首个出现的目标值
    @Override
    public void remove(int toRemove) {
        int pos=indexOf(toRemove);
        for(int i=pos;i<usedSize-1;i++){
            values1[i]=values1[i+1];
        }
        usedSize--;
    }
    //移除所有目标值
    public void removeAll(int toRemove){
        int pos=indexOf(toRemove);
        int count=1;
        for(int i=pos,j=pos+1;j<usedSize;i++,j++){
            if(values1[j]==toRemove){
                j++;
                count++;
            }
            values1[i]=values1[j];
        }
        usedSize-=count;
    }
    //获取顺序表数据个数
    @Override
    public int size() {
        return usedSize;
    }
    //清空顺序表
    @Override
    public void clear() {
        usedSize=0;
        values1=null;
    }
    //打印顺序表
    @Override
    public void display() {
        for(int i=0;i<usedSize;i++){
            System.out.println(values1[i]);
        }
    }

}

自定义指定位置非法异常

public class PosIllegalException extends RuntimeException{
    public PosIllegalException(){

    }
    public PosIllegalException(String arg){
        super(arg);
    }
}

2.3 测试代码

实现完上面代码后可通过下方代码进行测试

public static void main(String[] args) {
        IList myArray=new MyArray();
        myArray.add(1);
        myArray.add(2);
        myArray.add(3);
        myArray.add(4);
        myArray.add(5);
        myArray.add(6);
        myArray.add(1);
        myArray.add(7);
        myArray.add(3,99);
        System.out.println( myArray.contains(99));
        System.out.println(myArray.indexOf(99));
        System.out.println(myArray.get(5));
        myArray.set(4,23);
        myArray.remove(23);
        myArray.removeAll(1);
        System.out.println(myArray.size());
        System.out.println("=======");
        myArray.display();
        myArray.clear();
        System.out.println("========");
        myArray.display();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载npm I就包错解决方案

npm i xxxx -S --legacy-peer-deps 如果包错就执行以上命令

【CSP CCF记录】202209-1 如此编码

题目 过程 C中"/"的使用 当a和被b均为int, long, char这样的整数类型&#xff0c;此时除法运算的结果为所得商的整数部分&#xff0c;例如&#xff1a;180/100&#xff0c;结果为1&#xff1b; int a 180;int b a / 100;cout << b << endl;#结果为1当…

用Arm CCA解锁数据的力量

安全之安全(security)博客目录导读 目录 CCA将如何改变Arm架构呢? 在实践中部署CCA 释放数据和人工智能的全部力量和潜力 早期计算中最大的挑战之一是管理计算资源&#xff0c;以最大化计算效率同时提供给不同程序或用户分配资源的分离。这导致了我们今天大多数使用的时间…

windows安装DrawDB

下载 新建一个目录drawdb,使用git下载&#xff0c;如果没有安装git的话&#xff0c;进入git官网进行下载windows版本 https://git-scm.com/downloads。 空白地方鼠标右键&#xff0c;打开git终端 执行命令&#xff1a; git clone https://github.com/drawdb-io/drawdb 安装依…

阿里巴巴找黄金宝箱(II) - 贪心思维

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输出描述三、输入描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布自己的解题思路&#xff0c;希望大家多指教 一、题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发…

【自动驾驶技术栈学习】1-硬件《大话自动驾驶》| 综述要点总结 by.Akaxi

----------------------------------------------------------------------------------------------------------------- 致谢&#xff1a;感谢十一号线人老师的《大话自动驾驶》书籍&#xff0c;收获颇丰 链接&#xff1a;大话自动驾驶 (豆瓣) (douban.com) -------------…

头歌(EduCoder):数据挖掘算法原理与实践 -- 决策树

【头歌】机器学习实训代码 第一关&#xff1a;决策树算法思想 1、下列说法正确的是&#xff1f;&#xff08; AB &#xff09; A、训练决策树的过程就是构建决策树的过程B、ID3算法是根据信息增益来构建决策树C、C4.5算法是根据基尼系数来构建决策树D、决策树模型的可理解性不…

GPU性能实时监控的几种软件

在深度学习服务器上&#xff0c;各种模型的训练&#xff0c;需要监控GPU的情况&#xff0c;并且需要根据使用状态来切换不同的GPU上。 有以下四款软件&#xff0c;可以很好的进行GPU状态监控。 1. nvidia-smi 一个跨平台工具&#xff0c;用于监控和管理NVIDIA GPU的状态和性…

python获取网页表格数据

需求 需要网页中的基因&#xff08;Gene Symbol&#xff09;&#xff0c;一共371个。 使用pandas读取网页表格 read_html 返回的是列表&#xff08;a list of DataFrame&#xff09; import pandas as pd import bioquest as bq url "http://exocarta.org/browse_resul…

1068: 图的按录入顺序深度优先搜索

解法&#xff1a; #include<iostream> #include<vector> #include<string> using namespace std; int arr[100][100]; string vertex; void dfs(vector<int>& a,int u) {a[u] 1;cout << vertex[u];for (int i 0; i < a.size(); i) {if…

Windows11系统安装Mysql8之后,启动服务net start mysql报错“服务没有响应控制功能”的解决办法

问题 系统环境&#xff1a;Windows11 数据库版本&#xff1a;Mysql8 双击安装&#xff0c;一路下一步&#xff0c;完成&#xff0c;很顺利&#xff0c;但是开启服务后 net start mysql 报错&#xff1a; 服务没有响应控制功能。 请键入 NET HELPMSG 2186 以获得更多的帮助 不…

什么是分库分表

读写分离主要应对的是数据库读并发&#xff0c;没有解决数据库存储问题。试想一下&#xff1a;如果 MySQL 一张表的数据量过大怎么办? 答案当然是分库分表 什么是分库&#xff1f; 分库 就是将数据库中的数据分散到不同的数据库上&#xff0c;可以垂直分库&#xff0c;也可…

Today At Apple 20240512 学习拍照

文章目录 微距打开模式设置曝光值人像模式设置光模式实况 官网&#xff1a; https://www.apple.com/today/Apple 亚洲第一大商店&#xff1a;Apple 静安零售店现已在上海开幕如下预约课程&#xff1a;下载apple store&#xff08;不是app store&#xff09;&#xff0c;点击课程…

前端面试:谈谈 JS 垃圾回收机制

垃圾回收 JavaScript 中的内存管理是自动执行的&#xff0c;而且是不可见的。我们创建基本类型、对象、函数……所有这些都需要内存。 当不再需要某样东西时会发生什么? JavaScript 引擎是如何发现并清理它? 可达性 JavaScript 中内存管理的主要概念是可达性。 简单地说…

力扣HOT100 - 763. 划分字母区间

解题思路&#xff1a; class Solution {public List<Integer> partitionLabels(String s) {int[] last new int[26];int len s.length();for (int i 0; i < len; i) {last[s.charAt(i) - a] i;//记录字母最远的下标}List<Integer> partition new ArrayList…

低血压怎么办?低血压患者应该如何调理?

点击文末领取揿针的视频教程跟直播讲解 低血压在生活中也是一种常见的问题&#xff0c;低血压的朋友常有头晕眼黑、冒冷汗等症状&#xff0c;对工作学习产生了一定的影响。 什么是低血压呢&#xff1f; 低血压是指体循环动脉压力低于正常的状态。即血压低于正常水平。 ​一般…

【论文精读】| KBS2023-TMBL-多模态情感分析系列文章解读

TMBL: Transformer-based multimodal binding learning model for multimodal sentiment analysis 一. KBS2023-TMBL-用于多模态情感分析的极向量和强度向量混合器模型1 Abstract1.1 Motivation1.2 Method1.3 Results 2. Related Work2.1 情感分析2.1 基于transformer的2.1 模态…

LeetCode_栈和队列相关OJ题目

✨✨所属专栏&#xff1a;LeetCode刷题专栏✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 上一篇&#xff1a;数据结构_栈和队列(Stack & Queue)-CSDN博客 有效的括号 解析: 这里我们用数组实现的栈来解决这个问题&#xff0c;在有了栈的几个基础接口之后&#xff0c;我们运用这…

下班后的空余时间,有什么好的副业方向吗,用心发现适合你的兼职

下班后的空余时间可以利用来开展一些副业&#xff0c;这里我整理了一些&#xff0c;人人可做的 1. 在线教育/培训 如果你是某个领域的专家&#xff0c;可以尝试开展在线教育或培训课程&#xff0c;比如在专业知识、创意设计、编程等领域。 2. 写作/编辑 如果你对写作比较有…

SUSTech组会记录

SUSTech组会记录 2022年2月18日组会记录2022年3月4日组会记录2022年3月11日组会记录2022年3月18日组会记录2022年3月25日组会记录2022年4月2日组会记录2022年4月8日组会记录2022年4月15日组会记录2022年4月22日组会记录2022年4月29日组会记录2020年5月20日组会记录2022年5月27日…