自学内容网 自学内容网

数据结构——顺序表(java实现)


顺序表

顺序表的定义

顺序表是线性表的一种
所谓线性表指一串数据的组织存储在逻辑上是线性的,而在物理上不一定是线性的
顺序表的底层实现是数组,其由一群数据类型相同的元素组成,其在逻辑与物理上均是线性的。

代码实现:

创建一个顺序表的类

在java中是将顺序表实现为一个类,所有与顺序表相关的属性与方法封装在这个类里面,这与c语言实现顺序表不同

public class MyArrayList {

    private  int [] array ;
    //记录当前顺序表中使用的空间的个数
    int usedsize = 0;
    //所有空间的个数,spacesize,默认为10
    public static final int DEFAULT_SIZE = 10;
    int spacesize =DEFAULT_SIZE ;

    public MyArrayList() {
        this.array = new int[DEFAULT_SIZE];
    }
}

在顺序表中增加一条新的数据

 public void add(int data) {
        //先保证空间足够
        spaceextends();
        array[usedsize++] = data;
    }

在顺序表中增加一条数据时,首先需要判断空间是否足够,如果不够,则需要扩容,我们把这一步骤专门封装成一个方法:

  private void  spaceextends(){  
        if(spacesize>usedsize){
            return ;
        }else {

            //调用数组本身的方法,使其扩展两倍
            this.array = Arrays.copyOf(this.array, this.array.length * 2);
            
            spacesize = spacesize * 2;
            return ;
        }
    }

展示顺序表中内容

public void display() {
        //展示顺序表中的元素
        for (int i = 0; i < usedsize; i++) {
            System.out.print(array[i]+" ");
        }

    }

测试一下

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        arrayList.display();
    }
}

在这里插入图片描述

在pos位置处插入一条数据

在pos位置处插入一条数据,则需要pos位置以及其后的数据全部向右移动一位
然后再在pos位置插入数据。

  1. 存在pos是否合法的问题,pos不能为负数,且pos的位置之前必须有元素(比如设置pos为200,但是数组中存放元素的下标只到5,那么中间195个位置均浪费掉了,所以要求pos之前必须有元素)
  2. 空间是否足够的问题,,需要调用我们之前定义的方法
     public void pos(int pos ,int data) {

        if (pos>usedsize|| pos<0){
                   throw new PosworongfulException("pos位置异常");
        }else {
            spaceextends();
            //下面的语句也符号usedsize==pos时
                for (int i = usedsize;i>=pos ;i--) {
                         array[i]  =     array[i-1];
                }
                array[pos] = data;
                usedsize++;
            }
        }

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        try {
                 arrayList.pos(1,5);//在1位置插入5
        }catch (PosworongfulException e){
            e.printStackTrace();
        }
        arrayList.display();
    }
}

在这里插入图片描述
测试:在-1位置插入10

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        try {
                 arrayList.pos(-1,10);
        }catch (PosworongfulException e){
            e.printStackTrace();
        }
        arrayList.display();
    }
}

在这里插入图片描述

判断顺序表中是否包含指定的数据

 public boolean contains(int toFind) {
          //判断是否包含指定的数据
        //需要遍历整个顺序表
        for (int i = 0; i < usedsize; i++) {
            if (array[i] == toFind){
                return true ;
            }
        }
        return false;
    }

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        System.out.println(arrayList.contains(20));
        System.out.println(arrayList.contains(5));
        arrayList.display();
    }

在这里插入图片描述

查找某个数据在顺序表中的位置

 public int indexof(int toFind) {
        //判断某个元素对应的位置
        //依然需要查找顺序表
        for (int i = 0; i < usedsize; i++) {
            if (array[i] ==toFind){
                //找到了返回i ,没找到返回-1
                return i;
            }
        }
        return -1;
    }
public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
     
        System.out.println(arrayList.indexof(5));
        System.out.println(arrayList.indexof(9));
        System.out.println(arrayList.indexof(20));
        //arrayList.display();
    }

}

在这里插入图片描述

获取pos位置的元素

 public int get(int pos) {
        //获取pos位置的元素
        //先判断pos 合不合法,是否小于usedsize
        if(pos >=usedsize||pos<0){
            System.out.println("输入的pos不合法");
           throw new PosworongfulException("Pos位置不合法");
        }else {
            return array[pos];
        }
    }

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        try {


            System.out.println(arrayList.get(1));
            System.out.println(arrayList.get(10));
        } catch (PosworongfulException e) {
            e.printStackTrace();
        }
    }

}

在这里插入图片描述

将pos位置的元素改为value

public void setValue(int pos, int value) {
        //将pos位置的值改为value
        //也需要判断pos位置合不合法
        if(pos >=usedsize||pos<0){
            System.out.println("输入的pos不合法");
            throw new PosworongfulException("Pos位置不合法");
        }else {
            array[pos] = value;

        }
    }

测试:

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        arrayList.display();
        System.out.println();
        try {
           arrayList.setValue(1,10);
           arrayList.setValue(10,5);
        } catch (PosworongfulException e) {
            e.printStackTrace();
        }
        arrayList.display();
    }




}

在这里插入图片描述

删除顺序表中第一个出现的数据

  public void remove(int toFind) {
        //删除第一次出现的关键字key
        //先判断此元素在数组中的下标
         int ret = this.indexof(toFind);
         if(ret ==-1){
             System.out.println("没有这个数字");
         }
         else {
             //将ret下标之后的数据往左移动一位
             for (int i = ret; i < usedsize-1; i++) {
                 this.array[i] = this.array[i+1];
             }
             this.usedsize--;

             
         }
    }

测试:

package demo1;

public class Test {
    public static void main(String[] args) {
        MyArrayList arrayList = new MyArrayList();
        arrayList.add(5);
        arrayList.add(6);
        arrayList.add(10);
        arrayList.add(9);
        arrayList.display();
        System.out.println();
       arrayList.remove(5);
       arrayList.remove(20);
        arrayList.display();
    }

}

在这里插入图片描述

清空顺序表:

    public void clear() {
          //清空顺序表
          //对于基本数据类型则将usedsize置为0即可,因为我们是根据usedsize对数组进行操作的
        //usedsize为0,相当于顺序表为空,如果顺序表数据类型为引用数据类型,则需要将每个数组元素
        //置为null
        this. usedsize = 0;
    
    }

原文地址:https://blog.csdn.net/2301_77993957/article/details/139766427

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!