欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 数据结构(JAVA)顺序表

数据结构(JAVA)顺序表

2025/1/31 23:19:24 来源:https://blog.csdn.net/2301_81225368/article/details/143282055  浏览:    关键词:数据结构(JAVA)顺序表

文章目录

  • 1. 线性表
  • 2.顺序表
    • 2.1 顺序表接口实现
  • 3. ArrayList
    • 3.1ArrayList的构造方法
    • 3.2ArrayList的常用方法
  • 4.ArrayList的优缺点
    • 4.1优点
    • 4.2缺点


#1024程序员节|征文#
在这里插入图片描述

1. 线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的。

2.顺序表

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

2.1 顺序表接口实现

我们自己先来实现顺序表(以int类型为例)

public class ArrayList {private int[] elem;private int usedSize;// 默认构造方法public ArrayList(){}// 将顺序表的底层容量设置为initcapacitypublic ArrayList(int initcapacity){}// 新增元素,默认在数组最后新增public void add(int data) {}// 在 pos 位置新增元素public void add(int pos, int data) {}// 判定是否包含某个元素public boolean contains(int toFind) { return true; }// 查找某个元素对应的位置public int indexOf(int toFind) { return -1; }// 获取 pos 位置的元素public int get(int pos) { return -1; }// 给 pos 位置的元素设为 valuepublic void set(int pos, int value) {}//删除第一次出现的关键字keypublic void remove(int toRemove) {}// 获取顺序表长度public int size() { return 0; }// 清空顺序表public void clear() {}
}
//下标不合法异常  下面要使用到
public class PosIllegal extends RuntimeException {public PosIllegal() {}public PosIllegal(String msg) {super(msg);}
}
//空异常  下面要使用到
public class EmptyException extends RuntimeException{public EmptyException() {}public EmptyException(String msg) {super(msg);}
}

2.1.1默认构造方法

我们先开辟10个数组空间。

    private static final int DEFALUT_SIZE = 10;// 默认构造方法public ArrayList() {this.elem = new int[DEFALUT_SIZE];}

2.1.2将顺序表的底层容量设置为initcapacity

传入参数,实现数组长度。

    // 将顺序表的底层容量设置为initcapacitypublic  ArrayList(int initcapacity){this.elem = new int[initcapacity];}

2.1.3尾插
传入尾插的数据,并实行插入。
注意事项:

  1. 顺序表是否已满,如果已满就扩容。
  2. 元素加一(usedSize++)。
    //判断顺序表是否满了private boolean isFull() {return usedSize == elem.length;}//顺序表扩容private void grow() {this.elem = Arrays.copyOf(elem,2*elem.length);}// 新增元素,默认在数组最后新增public void add(int data) {//判满 + 扩容if(isFull()) {grow();}this.elem[this.usedSize] = data;usedSize++;}

2.1.4在pos位置插入
传入pos下标和data数据,并在pos位置插入。
注意事项:

  1. 顺序表是否已满,如果已满就扩容。
  2. 元素加一(usedSize++)。
  3. 判断pos下标是否合法。
  4. 一定要从末尾开始遍历到pos位置,如果从pos位置开始遍历会数据覆盖。
    //判断下标是否合法private void getPosIsLegitimate (int pos) throws PosIllegal{if (pos < 0 || pos >= usedSize) {throw new PosIllegal("Pos不合法");}}// 在 pos 位置新增元素public void add(int pos, int data) {try{getPosIsLegitimate(pos);//判满 + 扩容if(isFull()) {grow();}for(int i = elem.length-1;i > pos;i--) {this.elem[i+1] = elem[i];}this.elem[pos] = data;usedSize++;}catch(PosIllegal e) {System.out.println("pos下标不合法");e.printStackTrace();}}

2.1.5判定是否包含某个元素
遍历数组,观察数组中是否包含传入的参数(toFind),如果有返回true,否则返回法false。

    // 判定是否包含某个元素public boolean contains(int toFind) {for(int i = 0;i < elem.length;i++) {if(this.elem[i] == toFind) {return true;}}return false;}

2.1.6查找某个元素对应的位置
遍历数组,观察数组中是否包含传入的参数(toFind),如果有返回下标 i,否则返回法 -1。

    // 查找某个元素对应的位置public int indexOf(int toFind) {for(int i = 0;i < elem.length;i++) {if(this.elem[i] == toFind) {return i;}}return -1;}

2.1.7获取 pos 位置的元素
查找pos下标,并返回下标pos的值。
注意事项:

  1. 检查顺序表是否为空。
  2. 判断pos下标是否合法。
    //判断顺序表是否为空private void checkEmpty() {if(isEmpty()) {throw new EmptyException("顺序表为空!!!");}}// 获取 pos 位置的元素public int get(int pos) {try {checkEmpty();getPosIsLegitimate(pos);return elem[pos];}catch (PosIllegal e) {e.printStackTrace();}catch (EmptyException e) {e.printStackTrace();}return -1;}

2.1.8给 pos 位置的元素设为 value
将pos下标的元素更改为value。
注意事项:

  1. 检查顺序表是否为空。
  2. 判断下标是否合法。
    // 给 pos 位置的元素设为 valuepublic void set(int pos, int value) {try {checkEmpty();getPosIsLegitimate(pos);elem[pos] = value;}catch (PosIllegal e) {e.printStackTrace();}catch (EmptyException e) {e.printStackTrace();}}

2.1.9删除第一次出现的关键字key
将第一次出现的关键字key删除。
注意事项:

  1. 检查顺序表是否为空。
  2. 判断下标是否合法。
  3. 元素减一(usedSize–)。
    //删除第一次出现的关键字keypublic void remove(int toRemove) {try {checkEmpty();int pos = indexOf(toRemove);if(pos == -1) {return;}else {for(int i = pos;i < elem.length-1;i++) {elem[i] = elem[i+1];}usedSize--;}}catch (EmptyException e) {e.printStackTrace();}}

2.1.10 获取顺序表长度
获取顺序表长度就是获取顺序表元素的个数,即usedSize。

    // 获取顺序表长度public int size() {return usedSize;}

2.1.11清空顺序表
将所用元素置为零,并将usedSize置为零。
注意事项:

  1. 顺序表源码是存储泛型的,源码清空顺序表,是将所用元素置为空,而这里我们以整形为例,所以置为零。
    // 清空顺序表public void clear() {for(int i = 0;i < elem.length;i++) {elem[i] = 0;}this.usedSize = 0;}

3. ArrayList

在JAVA 中的ArrayList类表示顺序表。
在这里插入图片描述
说明:

  1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
  2. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
  3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  4. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

3.1ArrayList的构造方法

ArrayList的三种构造方法如下:
在这里插入图片描述

3.2ArrayList的常用方法

ArrayList的常用方法如下:
在这里插入图片描述

4.ArrayList的优缺点

4.1优点

给定下标,查询速度很快。

4.2缺点

  1. 插入,删除速度慢。
  2. 扩容,会造成空间浪费。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com