IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 在Java中实现顺序表 -> 正文阅读

[数据结构与算法]在Java中实现顺序表

1.什么是顺序表

顺序表:是线性表的存储结构,指在一组地址连续的存储单元中依次的存储每个元素,使逻辑相邻的元素存储在物理相邻的存储单元的线性表中。

2.顺序表的实现

(1)创建一个MyArrayList类

public class MyArrayList {
    private long[] array;
    private int size;

    //创建该类的构造方法
    public MyArrayList() {
        array = new long[2];  // 1) 存元素的空间  2) 空间的容量
        size = 0;             // 元素的个数
        Arrays.fill(array, Long.MIN_VALUE); //将 Long.MIN_VALUE 假定为无效值
    }
}

(2)获取数组长度

public int size() {
      return size;
   }

(3)检查对象的正确性

public void check() {
        if (array == null) {    //表不能为空否则抛出异常
            throw new RuntimeException();
        }
        if (array.length == 0) {    //表的容量不能为0
            throw new RuntimeException();
        }
        if (size < 0) {    //元素个数不能小于0
            throw new RuntimeException();
        }
        if (size > array.length) {    //元素个数不能大于容量
            throw new RuntimeException();
        }
        for (int i = 0; i < size; i++) {    //[0,size)为有效元素,不是无效值 Long.MIN_VALUE
            if (array[i] == Long.MIN_VALUE) {
                throw new RuntimeException();
            }
        }
        for (int i = size; i < array.length; i++) {    //[size,arrya.length)都是无效值 Long.MIN_VALUE
            if (array[i] != Long.MIN_VALUE) {
                throw new RuntimeException();
            }
        }
    }

(3)定义add方法用来插入元素

尾插操作(pushBack)

//e为需要插入的元素
public void add(long e) {
        enSureCapacity();   //该方法用来判断需不需要对表进行扩容
        array[size] = e;
        size++;
    }

在指定位置进行插入

//index为需插入的位置   e为需要插入的元素
public void add(int index, long e) {
        if (index < 0 || index >= size) {    //判断传入的下标是否合法
            throw new ArrayIndexOutOfBoundsException("输入下标不符合[0,size) index:" + index);
        }
        enSureCapacity();    //判断需不需要对表进行扩容
        for (int i = size - 1; i >= index; i--) {    //从后往前遍历到待插入位置
            int j = i + 1;                           
            array[j] = array[i];                     //将元素统一后移
        }
        array[index] = e;                            //将待插入元素插入
        size++;                                      //插入完成后元素个数加1
    }

enSureCapacity方法 判断是否需要扩容

private void enSureCapacity() {
        if (size < array.length) {    //元素个数小于表的容量可以继续放值,不用进行扩容
            return;
        }
        //一定放不下了,需要扩容
        int newLength = array.length * 2;    //新容量至少是array.length + 1,一般扩容至原容量的1.5~2倍
        long[] newArray = Arrays.copyOf(array, newLength);      //将原数组的newLength容量的元素复制给新数组
        Arrays.fill(newArray, size, newLength, Long.MIN_VALUE); //将新数组的无效区域赋为无效值 Long.MIN_VALUE 
        array = newArray;    //将新数组赋给原数组
    }

(4)定义delete方法用来删除元素

传入下标进行删除

 public void delete(int index) {
        if (index < 0 || index > size) {    //判断下标是否合法
            throw new ArrayIndexOutOfBoundsException("输入下标不符合[0,size] index:" + index);
        }
        for (int i = index; i < size - 1; i++) {    //从前往后遍历到待删除位置
            int j = i + 1;
            array[i] = array[j];                    //将元素整体前移
        }
        array[size - 1] = Long.MIN_VALUE;           //给无效区域赋无效值 Long.MIN_VALUE
        size--;                                     //删除元素后元素个数减1    
    }

传入值删除与值相同的元素

public void delete(long e) {
        boolean flag = false;    //判断表中是否存在要删除的元素(定义一个查找结果标志flag,默认为flase)
        for (int i = 0; i < size; i++) {
            if (array[i] == e) {    //判断表中元素是否与传入值相同
                flag = true;        //一旦找到,flag变为true,并退出循环
                break;
            }
        }
        if (flag) {      
            int j = 0;    //j一开始指向第一个元素位置    
            for (int i = 0; i < size; i++) {    //i也从第一个位置开始到最后一个元素
                if (array[i] != e) {            //不是要删除的元素就移动到j位置的元素上
                    array[j] = array[i];
                    j++;     //j的位置向后移动
                }
            }
            size = j;        //j的大小就是元素的个数
            Arrays.fill(array, size, array.length, Long.MIN_VALUE);  //将无效区域赋值为无效值 Long.MIN_VALUE
        } else {
            throw new RuntimeException("表中没有该元素无法进行删除 element:" + e);  //表中没有该元素抛出异常
        }
    }

思想:将在 i 位置上元素的移动到 j 位置的元素上
1.如果还没有碰到要删除的元素就进行元素移动
在这里插入图片描述
2.如果碰到了要删除的元素就跳过该元素
在这里插入图片描述
3.重复 1 和 2 的操作
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
最后 j 的大小就是元素的个数

以上就是顺序表中一些基本的操作,例如:遍历、元素添加、元素删除、获取数组长度、检查对象正确性。
如有错误,欢迎指正!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:17:15  更:2021-12-03 13:17:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:28:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码