資料結構與演算法系列(一)陣列實現

上古神龍發表於2020-05-16

資料結構與演算法系列(一)陣列實現

注:這是一個新的系列,主要是由於資料結構與演算法是程式設計師以後立身的根本,我以前在大學也學過,但是很快就忘記了,現在想把它撿起來,通過寫一個系列文章,加深自己的理解,其實我寫這個系列主要是想先通過預熱,然後去刷leetcode。刷演算法本身是想鍛鍊自己寫程式的思維,不想因為每天寫業務程式碼,導致自己思維僵化,此係列會與springboot系列同時更新,立個falg。

java實現陣列

說明:

  • 陣列是一段擁有連續儲存相同型別的結構,並且是一種線性結構,因為是線性結構,所以陣列中每一個資料,都有,但是注意,不包括開始資料(首)和末資料。
  • 陣列有一個非常重要的特性,那就是隨機訪問

1.定義陣列

陣列有兩個基本變數:

  • 陣列長度:含義是表示陣列本身大小
  • 陣列儲存具體資料的連續空間
 // 陣列申請空間的長度
    private int size = 0;
    // 陣列實際長度
    private int count;
    // 陣列實際儲存
    private int array[];

2.基本方法:構造方法 增 刪 查 改

構造方法

   /**
     * 構造方法-初始化
     * @param capacity 陣列初始化長度
     */
    public MyArray(int capacity) {
        this.size = capacity;
        this.array = new int[capacity];
        this.count = 0;
    }
  // 使用構造方法,初始化空間大小
  MyArray myArray = new MyArray(6);

新增

注:新增本質上就是在連續的空間插入新的資料,我目前已知兩種
  • 第一種,就是先將從陣列的尾部位置開始依次將資料向後移動一位,將index所指向的位置騰出來,方便插入新的資料。如圖所示,先後依次移動 55 44 33 ,這樣,位置就空出來,切忌不能先移動33,如果先移動 33,則33會直接覆蓋掉44。程式碼如下
    在這裡插入圖片描述
  • 第二種,就是直接將指定index位置的資料直接取出,放到陣列的末尾,這樣就避免了陣列的整體移動,當資料量很大的時候,可以考慮這種做法。
   /**
     * 根據索引在指定位置插入資料
     * @param index 索引
     * @param value 帶插入的值
     */
    protected boolean myArrayInsert(int index,int value){

        // 判斷陣列是否還有空餘空間
        if (count == size){
            System.out.println("沒有可插入的空間");
            return false;
        }

        // 判斷是否越界
        if (index < 0 || index >= size){
            System.out.println("陣列越界異常");
            return false;
        }

        // 迴圈,從插入的位置開始依次將資料向後移動,將index所指向的位置騰出來,方便插入新的資料
        for (int i = count; i > index; i--) {
            array[i] = array[i-1];
        }
        array[index] = value;
        count ++ ;
        System.out.println("插入成功");
        return true;
    }

刪除:同新增,依然有兩種方法

  • 第一種:index索引刪除的位置開始,後面的元素依次向前移動一位,將前面的覆蓋掉就行了。但是依然需要移動索引之後的每一個元素。
    在這裡插入圖片描述
  • 第二種:最簡單的就是,直接將陣列的最後一位元素放入 index的位置,這樣就減少了資料的移動
   /**
     * 刪除指定位置的數
     * @param index 索引
     */
    protected boolean myArrayDel(int index){
        if (index < 0 || index >= count){
            System.out.println("索引越界");
            return false;
        }

        for (int i = index; i < count - 1; i++) {
            array[i] = array[i + 1];
        }
        count --;
        System.out.println("刪除成功");
        return true;
    }

查詢:返回查詢成功之後資料的索引值

   /**
     * 陣列查詢
     * @param value 待查詢的值
     * @return 返回該值對應的索引
     */
    protected int myArrayFind(int value){
        for (int i = 0; i < count; i++) {
            if (array[i] == value){
                System.out.println("查詢成功");
                return i;
            }
        }
        System.out.println("查詢不成功,該數不存在");
        return -1;
    }

修改

   /**
     * 修改替換指定位置的資料
     * @param index 指定位置索引
     * @param value 值
     * @return 是否修改成功
     */
    protected boolean myArrayModify(int index,int value){
        if (index < 0 || index >= count){
            System.out.println("索引越界");
            return false;
        }

        array[index] = value;
        return true;
    }

列印輸出:為了方便查詢效果,提供列印方法

   /**
     * 陣列列印
     *
     */
    protected void printAll(){
        System.out.println("當前陣列實際長度:" + count);
        System.out.println("申請的陣列空間大小:" + size);
        for (int i = 0; i < count; i++) {
            System.out.println("位置:" + i + "----" + array[i]);
        }
    }

測試

public static void main(String[] args) {
        MyArray myArray = new MyArray(6);
        myArray.myArrayInsert(0,0);
        myArray.myArrayInsert(1,1);
        myArray.myArrayInsert(2,2);
        myArray.myArrayInsert(3,3);
        myArray.myArrayInsert(4,4);
        myArray.myArrayInsert(5,5);

        // 新增
        myArray.myArrayInsert(2,3);
        // 刪除
        myArray.myArrayDel(0);

        // 查詢
        int i = myArray.myArrayFind(4);
        System.out.println("對應的索引位置:" + i);
		// 修改
        myArray.myArrayModify(1,9);

        myArray.printAll();
    }

注:以上就是陣列的基本操作了,屬於個人理解,可能略顯淺顯,有錯誤的地方歡迎指正與交流。

希望自己能一直保持初衷,文章一直寫下去,和大家一起成長

本系列程式碼github地址:https://github.com/shanggushenlong/Data_Structures_and_Algorithms_Java

相關文章