顺序表(Java)

顺序表的概念:

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

顺序表一般可以分为:

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

顺序表最主要的特点:

1、支持随机访问能力
2、尾插效率比较高(顺序表中间/头部的插入删除,时间复杂度为O(N))

顺序表实现的主要功能有:

// 1、 打印顺序表
public void display() {  }

// 2、在 pos 位置新增元素
public void add(int pos, int data) { }

// 3、判定是否包含某个元素
public boolean contains(int toFind) { }

// 4、查找某个元素对应的位置
public int search(int toFind) { }

// 5、 获取 pos 位置的元素
public int getPos(int pos) {  }

// 6、 给 pos 位置的元素设为 value
public void setPos(int pos, int value) {  }

// 7、删除第一次出现的关键字 toRemove
public void remove(int toRemove) {  }

// 8、 获取顺序表长度
public int size() {  }

// 9、清空顺序表
public void clear() { }

实现顺序表的相关代码

public class SeqList {

    public int[] data = new int[100];
    public int size = 0;

    //打印顺序表
    public void display(){
        String s = "[";
        for(int i = 0;i<data.length;i++){
            s += data[i];
            if(i != data.length-1){
                s += ",";
            }
        }
        s += "]";
        System.out.println(s);
    }

    //在pos位置新增元素
    public void add(int pos,int val){
        //若pos不合法,直接返回
        if (pos<0 || pos>size){
            return;
        }
        //若原来数组的容量不够,就要进行扩容
        if(size>=data.length){
            int[] newData = new int[2*data.length];
            for(int i=0;i<data.length;i++){
                newData[i] = data[i];
            }
            data = newData;
        }
        //若pos恰好等于size,那么相当于尾插
        if(pos == size){
            data[pos] = val;
            size++;
            return;
        }
        //若在普通位置插入,首先要将pos位置开始的所有元素向后移一位,在插入val
        for(int i = size-1;i>=pos;i--){
            data[i] = data[i-1];
        }
        data[pos] = val;
        size++;
    }

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

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

    // 获取 pos 位置的元素
    public int getPos(int pos) {
        if(pos<0 || pos>size){
            return -1;
        }
        return data[pos];
    }

    // 给 pos 位置的元素设为 value
    public void setPos(int pos, int value) {
        if(pos<0 || pos>size){
            return ;
        }
        data[pos] = value;
    }

    //删除第一次出现的关键字toRemove
    //先找出要删除元素的位置,再根据不同位置进行删除
    public void remove(int toRemove) {
        int pos = search(toRemove);
        //若toRemove的坐标非法,那么直接返回
        if(pos == -1){
            return;
        }
        //若toRemove的坐标是最后一个,那么直接进行size--
        if(pos == size-1){
            size--;
            return;
        }
        //若toRemove的坐标在其他位置,那么将pos位置之后的所有元素向前移一位,在进行size--
        for(int i = pos;i<size-1;i++){
            data[i] = data[i+1];
        }
        size--;
    }

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

    // 清空顺序表
    public void clear() {
        size = 0;
    }
}

这里的代码主要是不同的功能模块,没有测试部分,测试部分需要另外写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值