数据结构第二篇【关于java线性表(顺序表)的基本操作】

简介: 数据结构第二篇【关于java线性表(顺序表)的基本操作】

本文主要讲解关于顺序表的基本操作,希望大家能够自己动手敲一敲🐒🦍🦧🐶

线性表是什么?🐵🐒🦍

线性表是一种数据结构,是由零个或多个数据元素的有限序列组成的。每个元素除了第一个元素外,都有一个直接前驱元素,除了最后一个元素外,都有一个直接后继元素。线性表的数据集合为{a1,a2,…,an},每个元素的类型均为DataType。线性表是存储逻辑关系为"一对一"的数据的最简单一种存储结构。线性表的物理结构不一定是连续的。

顺序表的定义🦧🐶🐵

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

顺序表:可动态增长的数组,要求数据是连续存储的,动态顺序表就是使用动态开辟的数组存储,我会通过代码来给大家讲解

以下顺序表中的方法是需要掌握的

public interface IList2 {
    //新增元素,默认在数组最后新增
    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();
    boolean isFull();
  //数组是否满了
    public boolean isEmpty();
    //数组是否为空
}

创建顺序表

public class MyArrayList {
   public int[] elem;
   public int usedSize;                    
   public static final int DEFAULT_SIZE=10;
   public MyArrayList(){
       this.elem = new int[DEFAULT_SIZE];  
   }
   public MyArrayList(int capacity){
       this.elem = new int[capacity];     
   }

首先我们创建一个顺序表(看做一个数组),有两个属性,第一个elem为数组,第二个为usedSize表示有效数据的个数。数组的长度我们通过构造方法来初始化,第一种是创建一个数组长度为10(用常量DEFAULT_SIZE表示)的数组,第二种是通过传参数来自定义数组的长度。

新增元素,默认在数组最后新增

在敲代码以前,我们需要考虑一个情况,如果数组满了,怎么才能添加元素,所以我们在添加元素之前,检查一下数组是否满了,如果满了,我们将进行扩容,再添加元素。而检查数组我们定义一个方法以后用到直接调用即可。我们需要用到两个方法一个为检查是否满了,一个方法来扩容。

public void add(int data) {
     checkCapacity();  //检查容量
         this.elem[this.usedSize] = data;
         this.usedSize++;
    }
 private void checkCapacity(){  
        if(isFull()){
            //扩容
            elem = Arrays.copyOf(elem,elem.length*2);//将elem数组的长度扩容为原来的两倍
        }
 }
  public boolean isFull() {
        return usedSize==elem.length; //数组长度是否等于有效数据的长度
 }

在 pos 位置新增元素

我们首先需要思考,pos位置是否合法,pos如果为-1,或者超多数组长度,则不再新增,那么我们使用自定义异常来处理,如果pos合法,在检查数组的容量,最后在新增元素,新增元素时,我们将从最后一个有效元素向后移动,依次向前,直到i<pos,pos位置为空,将elem[pos] 位置插入数据

public void add(int pos, int data) {
        try {
            checkPosOnAdd(pos);
        }catch (PosILLegality e){
            e.getStackTrace();
            return;
        }
        checkCapacity();
        for(int i = usedSize-1;i>=pos;i--){
            elem[i+1]=elem[i];
        }
        elem[pos] = data;
        usedSize++;
    }
    private void checkPosOnAdd(int pos)throws PosILLegality{
        if(pos<0&&pos>usedSize){
            System.out.println("不符合法");
            throw new PosILLegality("插入元素下标异常"+pos);
        }
    }
    public class PosILLegality extends RuntimeException{
    public PosILLegality(String msg){
        super(msg);
    }
}

判定是否包含某个元素

首先需要考虑如果数组为空,没有元素则不查找,直接返回false,其次,遍历数组查看是否存在

public boolean contains(int toFind) {
            if(isEmpty()){
                return false;
            }
            for(int i = 0;i<usedSize;i++){
                if(elem[i]==toFind){
                    return true;
                }
            }
            return false;
 }
 public boolean isEmpty() {
        return false;
}

查找某个元素对应的位置

首先判断数组是否为空,然后在进行查找,找到返回下标

public int indexOf(int toFind) {
        if(isEmpty()){
            return -1;
        }
        for(int i = 0;i<usedSize;i++){
            if(elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }

获取 pos 位置的元素

首先,判断pos位置是否合法,与新增元素不同(新增元素可以在数组最后新增)查找元素(只能在有效数据中查找),范围有差异,如果pos不合法直接抛出自定义异常,其次判断数组是否为空,最后在返回pos位置的元素。

public int get(int pos) throws MyArrayListEmpty{
        checkPosOnGetAndSet(pos);
        if(isEmpty()){
            throw new MyArrayListEmpty("获取指定下标元素时"+"顺序表位空");
        }
        return elem[pos];
    }
    private void checkPosOnGetAndSet(int pos) throws PosILLegality {
        if (pos < 0 || pos >= usedSize) {
            System.out.println("不符合法");
            throw new PosILLegality("获取制定下标的元素异常" + pos);
        }
    }
    public class PosILLegality extends RuntimeException{
    public PosILLegality(String msg){
        super(msg);
    }
}
public class MyArrayListEmpty extends RuntimeException{
    public MyArrayListEmpty(String msg){
        super(msg);
    }
}

给 pos 位置的元素设为 value 更新

首先,判断pos位置是否合法,与新增元素不同(新增元素可以在数组最后新增)查找元素(只能在有效数据中查找),范围有差异,如果pos不合法直接抛出自定义异常,如果合法,在进行修改元素

public void set(int pos, int value) {
            checkPosOnGetAndSet(pos);
            elem[pos]=value;
    }
private void checkPosOnGetAndSet(int pos) throws PosILLegality {
        if (pos < 0 || pos >= usedSize) {
            System.out.println("不符合法");
            throw new PosILLegality("获取制定下标的元素异常" + pos);
        }
    }
 public class PosILLegality extends RuntimeException{
    public PosILLegality(String msg){
        super(msg);
    }
}

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

首先用java自带函数找到关键字的下标,如果存在,那么如何删除呢,我们通过要删除的元素的后一个往前盖,元素i范围小于usedSize-1,如果等于usedSize-1,elem[i-1]将会越界

public void remove(int toRemove) {
        int index = indexOf(toRemove);
        if(index==-1){
            System.out.println("没有这个数字");
            return;
        }
        for(int i =index;i<usedSize-1;i++){
            elem[i]=elem[i+1];
        }
        usedSize--;
    }

获取顺序表长度

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

清空顺序表

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

打印顺序表

public void display() {
        for(int i = 0;i<this.usedSize;i++){
            System.out.println(this.elem[i]+" ");
        }
        System.out.println();
    }

相关文章
|
2月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
46 1
|
2月前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
88 2
|
2月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
64 2
|
20天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
40 6
|
26天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
29天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
29天前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
60 3
|
29天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明
|
2月前
|
存储 算法 Java
Java 中常用的数据结构
【10月更文挑战第20天】这些数据结构在 Java 编程中都有着广泛的应用,掌握它们的特点和用法对于提高编程能力和解决实际问题非常重要。
30 6
|
2月前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
31 1