顺序表是什么

简介: 顺序表是什么

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

数组不就是一个现场的顺序表吗?但是数组并没有直接向我们提供增删查改的工具,所以我们必须重新实现一下顺序表。

二、自定义异常
空引用异常
如果我们的顺序表为空时,手动抛出空引用异常

public class NullException extends RuntimeException{

public NullException(String message) {
    super(message);
}

}
1
2
3
4
5
下标越界异常
当我们进行增删查改时,下标越界时,我们手动抛出一个下标越界异常

public class IndexException extends RuntimeException{

public IndexException(String message) {
    super(message);
}

}
1
2
3
4
5
三、顺序表的方法
顺序表的实现
这里我们定义一个顺序表,默认容量为DEFAULTSIZE,实际大小为usedsize.

public class ArrList {

public int[] arr;
public int usedSize;
public static final int DEFAULTSIZE = 10;

public ArrList() {
    this.arr = new int[DEFAULTSIZE];
}

}
1
2
3
4
5
6
7
8
9
获取顺序表长度
usedSize存储的就是当前顺序表的长度,直接返回即可。

public int size() {

    return this.usedSize;
}

1
2
3
顺序表是否为空
此方法我们只想在顺序表内部使用,所以我们定义为private.

private boolean isEmpty() {

    return this.arr == null;
}

1
2
3
顺序表是否为满
此方法我们只想在顺序表内部使用,所以我们定义为private.

private boolean isFull() {

    //如果数组所放元素大于等于数组长度,那么数组满了
    return this.size() >= this.arr.length;
}

1
2
3
4
打印顺序表
public void display() {

    for (int i = 0; i < this.usedSize; i++) {
        System.out.print(arr[i]+" ");
    }
    System.out.println();
}

1
2
3
4
5
6
末尾新增元素
public void add(int data) throws NullException{

    //1.数组为空,报空异常
    if(isEmpty()) {
        throw new NullException("数组为空");
    }
    //2.数组满了,先增容
    if(isFull()) {
        this.arr = new int[2 * this.arr.length];
    }
    //3.进行新增
    this.arr[this.usedSize] = data;
    //4.元素+1
    this.usedSize++;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
指定位置新增元素
public void add(int pos, int data) throws RuntimeException,IndexException{

    //1.判断数组是否为空
    if(isEmpty()) {
        throw new NullException("数组为空");
    }
    //2.判断新增位置是否合法,抛数组越界异常
    if(pos < 0 || pos > this.arr.length) {
        throw new IndexException("数组越界");
    }
    //3.判断数组是否已满,进行扩容
    if(isFull()) {
        this.arr = new int[2 * this.arr.length];
    }
    //4.进行新增
    for (int i = this.usedSize - 1; i >= pos; i--) {
        this.arr[i+1] = this.arr[i];
    }
    this.arr[pos] = data;
    this.usedSize++;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
判断是否包含某元素
public boolean contains(int toFind) {

    for (int i = 0; i < this.usedSize; i++) {
        if(toFind == this.arr[i]) {
            return true;
        }
    }
    return false;
}

1
2
3
4
5
6
7
8
查找某个元素对应的位置
public int indexOf(int toFind) {

    for (int i = 0; i < this.usedSize; i++) {
        if(toFind == this.arr[i]) {
            return i;
        }
    }
    return -1; 
}

1
2
3
4
5
6
7
8
获取 pos 位置的元素
public int get(int pos) throws IndexException{

    //判断pos位置是否合法
    if(pos < 0 || pos >= this.usedSize) {
        throw new IndexException("输入pos位置数组越界");
    }else {
        return this.arr[pos];
    }
}

1
2
3
4
5
6
7
8
给 pos 位置的元素赋值
public void set(int pos, int value) throws NullException,IndexException{

    if(isEmpty()) {
        throw new NullException("数组为空");
    }
    //2.判断新增位置是否合法,抛数组越界异常
    if(pos < 0 || pos >= this.arr.length) {
        throw new IndexException("数组越界");
    }
    this.arr[pos] = value;
}

1
2
3
4
5
6
7
8
9
10
删除第一次出现的关键字key
public void remove(int toRemove) throws NullException{

    if(isEmpty()) {
        throw new NullException("数组为空");
    }
    int ret = indexOf(toRemove);
    if(ret == -1) {
        System.out.println("不存在此数");
        return;
    }
    if(ret != -1) {
        for (int i = ret; i < this.usedSize - 10; i++) {
            this.arr[i] = this.arr[i+1];
        }
    }
    this.usedSize++;
}
相关文章
|
安全 Linux 网络虚拟化
关于容器云的三种网络设计
【2月更文挑战第9天】容器网络设计:隧道、路由、VLAN。
|
机器学习/深度学习 存储 TensorFlow
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)
753 0
|
9月前
|
人工智能 自然语言处理 IDE
通义灵码 Visual Studio 终于支持模型切换
如需使用灵码模型选择,需要开发者将灵码 IDE 插件更新到最新版,前往下载安装包安装
733 0
通义灵码 Visual Studio 终于支持模型切换
|
运维 持续交付 数据中心
《深入理解Docker容器化技术》
《深入理解Docker容器化技术》
|
缓存 负载均衡 安全
正向代理和反向代理
本文详细介绍了代理和反向代理的概念及应用场景。代理作为一种中间人服务,可细分为正向代理与反向代理。前者位于客户端与网络间,有助于匿名浏览、访问控制、缓存加速及增强安全性;后者则位于网络与服务器间,主要用于负载均衡、缓存、安全性提升、SSL终止及内容过滤等。两者各有侧重,可根据具体需求选择使用。例如,Squid 是常用的正向代理框架,而 Nginx 则常用于反向代理。了解并合理运用两者,能有效提升网络性能与安全性。
808 4
|
JavaScript 前端开发 安全
Vue学习之--------内置指令的使用【v-bind、v-model、v-for、v-on、v-if 、v-else、v-show、v-text。。。】(2022/7/19)
这篇文章详细介绍了Vue中常见的内置指令,如v-bind、v-model、v-for、v-on、v-if、v-else、v-show、v-text和v-html等,并通过代码示例演示了它们的使用和效果。
Vue学习之--------内置指令的使用【v-bind、v-model、v-for、v-on、v-if 、v-else、v-show、v-text。。。】(2022/7/19)
|
前端开发 JavaScript Java
Spring Boot中的数据校验
Spring Boot中的数据校验
|
XML 前端开发 Java
【Spring】@RequestMapping、@RestController和Postman
【Spring】@RequestMapping、@RestController和Postman
295 2
【Spring】@RequestMapping、@RestController和Postman
|
存储 Linux Shell
Linux基本命令之修改主机名、用户名、密码
Linux基本命令之修改主机名、用户名、密码
|
存储 数据采集 大数据
Data Lake架构揭秘
Data Lake架构揭秘
260 0