數據結構與算法系列(一)數組實現

數據結構與算法系列(一)數組實現

注:這是一個新的系列,主要是因爲數據結構與算法是程序員之後立身的根本,我之前在大學也學過,可是很快就忘記了,如今想把它撿起來,經過寫一個系列文章,加深本身的理解,其實我寫這個系列主要是想先經過預熱,而後去刷leetcode。刷算法自己是想鍛鍊本身寫程序的思惟,不想由於天天寫業務代碼,致使本身思惟僵化,此係列會與springboot系列同時更新,立個falg。java

java實現數組

說明:git

  • 數組是一段擁有連續存儲相同類型的結構,而且是一種線性結構,由於是線性結構,因此數組中每個數據,都有,可是注意,不包括開始數據(首)和末數據。
  • 數組有一個很是重要的特性,那就是隨機訪問

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程序員

相關文章
相關標籤/搜索