数据结构与算法之数组

数组

数组是数据呈线性排列的一种数据结构,在数组中,访问数据十分简单,而添加和删除数据比较耗费功夫

 

 

 

 a是数组的名字,后面的"[]"中的数字表示该数据是数组中的第几个数据(这个数字叫做“数组下标”,下标从0开始计数),比如red就是数组a的第一个数据。

数组中的数据按顺序存储在内存的连续空间内,由于数据是存储在连续的空间内的,所以每个数据的内存地址(在内存的位置都可以通过数组下标算出,我们也就可以直接访问目标数据(“随机访问”)。

访问

若现在向访问red,只需要指定a[0]就可以访问

删除

但是如果想在任意位置上添加或删除数据,线性表的操作就会很复杂,这涉及到元素的移动,

例如将orange添加到第二个位置

首先要确保线性表的末尾还有存储空间,

 

 然后从将原有的数据网后移动,为新数据腾出位置,首先将blue后移,然后把green后移

 

 最后在空出来的位置上写入orange

 

 这样添加数据就完成了

 

 删除

如果要删除数据,也需要元素进行移动,例如删除orange元素

首先删除目标数据(这里指green)

 

 然后将后面的数据一一往左边的空位移动,先移动green

 

 再移动blue

 

 代码实现

首先先创建一个接口(MyList),接口含有增加(add),删除(remove),获取指定下标的元素(getData)获取元素个数(size),判断是否含有元素(isEmpty),清空元素(clear)

代码如下:

public interface MyList {
    public void add(int index,Object obj) throws Exception;//增加
    public Object remove(int index) throws Exception;//删除
    public Object getData(int index) throws Exception;//获取指定下标的元素
    public int size();//获取元素个数
    public boolean isEmpty();//判断是否含有元素
    public void clear();//清空元素
}

然后创建线性表类(MyArray),实现MyList接口,

类中属性:

  Object数组(o):用于存储数据

  常量(MAX_SIZE):表示线性表的最大存储容量

  int类型的size:表示当前线性表的元素个数

类中有两个构造方法

  默认构造方法:默认线性表最大容量为10

  带MAX_SIZE参数的构造方法:可自定义线性表的最大容量

若干个getter和settter方法

private Object[] o;//用于存储数据
    final int MAX_SIZE;//表示线性表的最大存储容量
    private int size;//表示当前线性表的元素个数

    public MyArray() {
        MAX_SIZE = 10;
        size = 0;
        o = new Object[MAX_SIZE];
    }

    public MyArray(int MAX_SIZE) {
        this.MAX_SIZE = MAX_SIZE;
        size = 0;
        o = new Object[this.MAX_SIZE];
    }
    public Object[] getO() {
        return o;
    }

    public void setO(Object[] o) {
        this.o = o;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

实现接口中的方法:

  增加(add)方法(如何设计add方法?)

    最后一个元素的下标是size-1,要执行往右移动的操作也就是说下标增加了1,最后一个元素的下标变成了size(size-1+1=size)以此类推一直往右移动,index-1就是要插入元素的下标,也就是说index-1这个位置移完就不需要再移动

代码如下:

public void add(int index, Object obj) throws Exception {
        for (int i = size; i > index ; i--) {
            o[i] = o[i-1];
        }
        o[index-1] = obj;
    }

但是java是具有健壮性这个特性的,所以我们也要让自己的代码具有健壮性,检查是否还有空位,检查传入的参数index是否合法

if (size == MAX_SIZE){
     throw new Exception("线性表已满");
}
if (index < 0 || index > size){
     throw new Exception("参数不合法");
}

完整代码就是

public void add(int index, Object obj) throws Exception {
        if (size == MAX_SIZE){
            throw new Exception("线性表已满");
        }
        if (index < 0 || index > size){
            throw new Exception("参数不合法");
        }
        for (int i = size; i > index0 ; i--) {
            o[i] = o[i-1];
        }
        o[index-1] = obj;
}

  删除(remove)方法(如何设计remove方法)

    在删除元素之前先备份元素,删除元素是将元素往左移动,首先是将下标为index的元素移到下标为index的位置上,然后以此类推,直到最后一个元素(下标为size-1)也移动完毕

代码如下

Object obj = o[index];//备份元素
        if (index == size-1){
            o[index] = null;
        }

        for (int i = index; i < size-1; i++) {
            o[i] = o[i+1];//移动
        }

 

  同样我们也要设立关卡,使得代码更具有健壮性

if (size == 0){
      throw new Exception("线性表为空,无法删除");
}
if (index < 0 || index > size){
       throw new Exception("参数不合法");
}

完整代码示例

public Object remove(int index) throws Exception {
        if (size == 0){
            throw new Exception("线性表为空,无法删除");
        }
        if (index < 0 || index > size-1){
            throw new Exception("参数不合法");
        }
        Object obj = o[index];//备份元素for (int i = index; i < size-1; i++) {
            o[i] = o[i+1];//移动
        }
        size--;
        return obj;//返回被删除的元素
    }

专门用于打印线性表数据的方法

//打印线性表的元素
    public void print(){
        try {
            for (int i = 0; i < size; i++) {
                System.out.print(getData(i) + " ");
            }
            System.out.println();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

获得元素的方法

public Object getData(int index) throws Exception {
        return o[index];
}

获得线性表个数

public int size(){
        return size;
}

判断是否线性表为空

public boolean isEmpty(){
        return (size==0?true:false);
}

清空线性表

public void clear() {
        size = 0;
}

接下来就是测试类

public class Demo {
    public static void main(String[] args) throws Exception {
        MyArray m = new MyArray();
        System.out.println(m.size());
        for (int i = 0; i < 10; i++) {
            m.add(i,i);//添加元素
        }
        m.print();//答应元素
        System.out.println();
        m.remove(9);//删除指定元素
        m.print();//删除后打印
        m.add(9,11);//添加元素
        m.print();//添加后打印
        System.out.println(m.isEmpty());//是否为空,false表示不为空
        m.clear();//清空线性表
        System.out.println(m.isEmpty());//是否为空,true表示为空
    }
}

写在最后

小菜鸟学数据结构的第一天,冲冲冲!!!

 

posted @ 2021-10-08 21:09  hello小番茄  阅读(167)  评论(0)    收藏  举报