【JAVA】实现一个动态顺序表

【JAVA】实现一个动态顺序表

顺序表

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

静态顺序表:使用定长数组存储。
动态顺序表:使用动态开辟的数组存储

静态顺序表适用于确定知道需要存多少数据的场景。
动态顺序表更灵活, 根据需要动态的分配空间大小

动态顺序表的实现

MyArrayList.java

import java.util.Arrays;

public class MyArrayList {
    private int[] elem;
    private int usedSize;
    public MyArrayList() {
        this.elem = new int[10];
    }
    public MyArrayList(int n) {
        this.elem = new int[n];
    }
    //打印顺序表
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }
    //判满
    public boolean isFull() {
        return this.usedSize == this.elem.length;
    }
    //增加顺序表的长度
    public void resize() {
        this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        //返回一个数组,而这个数组就等于数组elem的前2elem.length个数,也就是elem[0] ~ elem[2elem.length - 1]
        //即将数组的大小扩展为原来的两倍
    }
    //在pos位置新增元素
    public void add(int pos,int data) {
        if(isFull()) {
            resize();
        }
        //判断pos是否合法
        if(pos < 0 || pos > this.usedSize) {
            System.out.println("The location of the pos is illegal");
        }
        //移动元素
        for (int i = this.usedSize - 1; i >= pos ; i--) {
            this.elem[i + 1] = this.elem[i];//pos后的每一位都后移一位
        }
        this.elem[pos] = data;
        this.usedSize++;//新增一个元素后表长加一
    }
    //默认将元素插入到数组的最后
    public void add2(int data) {
        if(isFull()) {
            resize();
        }
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }
    //判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(this.elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }
    //查找某个元素对应的位置
    public int search(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if(this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }
    //获取pos位置的元素
    public int getPos(int pos) {
        if(pos < 0 || pos > this.usedSize) {
            System.out.println("The location of the pos is illegal");
            return -1;
        }
        return this.elem[pos];
    }
    //给pos位置的元素设为value
    public void setPos(int pos,int value) {
        if(pos < 0 || pos > this.usedSize) {
            System.out.println("The location of the pos is illegal");
        }
        this.elem[pos] = value;
    }
    //删除第一次出现的关键字key
    public void remove (int key) {
        int index = search(key);//查找key的位置
        if(index == -1) {//若key不存在
            System.out.println("No element key");
        }
        for(int i = index;i < this.usedSize - 1;i++) {
            this.elem[i] = this.elem[i + 1];//key元素后的所有元素都往前移位覆盖key
        }
        this.usedSize--;
    }
    //获取顺序表长度
    public int size() {
        return this.usedSize;
    }
    //清空顺序表
    public void clear() {
        this.usedSize = 0;
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(0,1);
        myArrayList.add(1,2);
        myArrayList.add(2,3);
        myArrayList.add2(4);
        myArrayList.add2(5);
        System.out.println(myArrayList.contains(5));//true
        System.out.println(myArrayList.search(4));//3
        System.out.println(myArrayList.getPos(1));//2
        myArrayList.display();//1 2 3 4 5
        myArrayList.setPos(0,111);
        myArrayList.remove(2);
        System.out.println(myArrayList.size());//4
        myArrayList.display();//111 3 4 5
        myArrayList.clear();
        myArrayList.display();
    }
}

运行结果:
在这里插入图片描述

END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我来回答你的问题。 建立一个顺序表Java代码示例如下: ```java public class SeqList<T> { private Object[] listArray; private int size; private int maxSize; public SeqList(int maxSize) { this.maxSize = maxSize; this.listArray = new Object[maxSize]; this.size = 0; } public boolean isEmpty() { return size == 0; } public boolean isFull() { return size == maxSize; } public int size() { return size; } public T get(int index) { if (index >= 0 && index < size) { return (T)listArray[index]; } else { return null; } } public boolean insert(int index, T element) { if (index < 0 || index > size || isFull()) { return false; } for (int i = size - 1; i >= index; i--) { listArray[i + 1] = listArray[i]; } listArray[index] = element; size++; return true; } public boolean remove(int index) { if (index < 0 || index >= size || isEmpty()) { return false; } for (int i = index; i < size - 1; i++) { listArray[i] = listArray[i + 1]; } listArray[size - 1] = null; size--; return true; } } ``` 这个代码定义了一个泛型类 `SeqList`,其中封装了一个数组 `listArray` 用于存储元素,以及其他一些方法,如 `isEmpty`、`isFull`、`size`、`get`、`insert` 和 `remove` 等。可以使用这个类来创建一个顺序表对象并进行元素的添加、删除和查找等操作。 ### 回答2: 顺序表是一种常见的线性数据结构,它可以用来存储一组具有相同数据类型的元素。在Java语言中,可以通过数组来实现顺序表。 首先,我们需要定义一个顺序表类,例如名为"SequentialList"的类。该类需要包含以下成员变量: - 一个数组,用于存储顺序表的元素。 - 一个变量,用于记录顺序表中已经存储的元素个数。 接下来,我们可以为该顺序表类添加一些常用的方法,例如: - 添加元素:定义一个"add"方法,该方法可以接受一个元素参数,将该元素添加到顺序表的末尾,并更新元素个数。 - 删除元素:定义一个"remove"方法,该方法可以接受一个索引参数,根据索引删除顺序表中的元素,并更新元素个数。 - 获取元素:定义一个"get"方法,该方法可以接受一个索引参数,根据索引返回顺序表中对应的元素。 - 修改元素:定义一个"set"方法,该方法可以接受一个索引参数和一个新值参数,根据索引修改顺序表中对应的元素。 除了上述方法,我们还可以添加一些辅助方法,例如: - 获取顺序表大小:定义一个"size"方法,用于返回顺序表中元素的个数。 - 判断顺序表是否为空:定义一个"isEmpty"方法,用于判断顺序表是否为空。 最后,我们可以在"SequentialList"类的主方法中编写一些测试代码,以验证顺序表的功能是否正确。 通过上述步骤,我们就可以使用Java语言建立一个简单的顺序表。当然,实际应用中可能需要考虑一些其他的因素,例如扩容、索引越界等情况。但是,通过这个基本框架,我们可以进一步扩展和优化顺序表的功能。 ### 回答3: 顺序表是一种常见的数据结构,用于存储一组数据。在Java语言中,可以使用数组来模拟顺序表实现。 首先,我们需要定义一个顺序表类,可以命名为SequentialList。该类应包含以下属性和方法: 1. 数据域data,用来存储顺序表中的数据。这里可以使用数组来实现。 2. 大小size,用来记录顺序表中元素的个数。 接下来,我们可以添加一些常用的方法来操作顺序表,比如: 1. 构造方法:用来创建一个空的顺序表对象。 2. 插入方法:在指定位置插入一个元素,需要考虑原有元素的后移。 3. 删除方法:删除指定位置的元素,需要考虑后续元素的前移。 4. 获取方法:获取指定位置的元素值。 5. 大小方法:获取顺序表中元素的个数。 6. 清空方法:将顺序表清空,使其变为空表。 下面是一个简单的顺序表示例代码: ``` public class SequentialList { private int[] data; private int size; public SequentialList() { data = new int[10]; // 假设顺序表的初始长度为10 size = 0; } public void insert(int index, int value) { // 判断插入位置的有效性 if (index < 0 || index > size) { throw new IndexOutOfBoundsException("插入位置无效!"); } // 如果顺序表已满,进行扩容 if (size == data.length) { int[] newData = new int[data.length * 2]; System.arraycopy(data, 0, newData, 0, size); data = newData; } // 将插入位置及之后的元素后移 for (int i = size; i > index; i--) { data[i] = data[i - 1]; } // 插入新元素 data[index] = value; size++; } public void remove(int index) { // 判断删除位置的有效性 if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("删除位置无效!"); } // 将删除位置之后的元素前移 for (int i = index; i < size - 1; i++) { data[i] = data[i + 1]; } size--; } public int get(int index) { // 判断获取位置的有效性 if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("获取位置无效!"); } return data[index]; } public int size() { return size; } public void clear() { size = 0; } } ``` 上面的代码只是一个简单的示例,实际的顺序表实现可能还需要考虑更多的细节,比如动态扩容、异常处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值