天天看點

資料結構與算法之數組

數組

數組是資料呈線性排列的一種資料結構,在數組中,通路資料十分簡單,而添加和删除資料比較耗費功夫

資料結構與算法之數組
資料結構與算法之數組

 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表示為空
    }
}      

寫在最後