1. 程式人生 > >資料結構與算法系列(一)陣列實現

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

## 資料結構與算法系列(一)陣列實現 注:`這是一個新的系列,主要是由於資料結構與演算法是程式設計師以後立身的根本,我以前在大學也學過,但是很快就忘記了,現在想把它撿起來,通過寫一個系列文章,加深自己的理解,其實我寫這個系列主要是想先通過預熱,然後去刷leetcode。刷演算法本身是想鍛鍊自己寫程式的思維,不想因為每天寫業務程式碼,導致自己思維僵化,此係列會與springboot系列同時更新,立個falg。` ## java實現陣列 說明: - `陣列`是一段`擁有連續`的`儲存相同型別`的結構,並且是一種`線性結構`,因為是線性結構,所以陣列中每一個數據,都有`前`和`後`,但是注意,不包括開始資料(首)和末資料。 - 陣列有一個非常重要的特性,那就是`隨機訪問` ### 1.定義陣列 #### 陣列有兩個基本變數: - 陣列長度:含義是表示陣列本身大小 - 陣列儲存具體資料的連續空間 ```java // 陣列申請空間的長度 private int size = 0; // 陣列實際長度 private int count; // 陣列實際儲存 private int array[]; ``` ### 2.基本方法:構造方法 增 刪 查 改 #### 構造方法 ```java /** * 構造方法-初始化 * @param capacity 陣列初始化長度 */ public MyArray(int capacity) { this.size = capacity; this.array = new int[capacity]; this.count = 0; } ``` ```java // 使用構造方法,初始化空間大小 MyArray myArray = new MyArray(6); ``` #### 新增 ##### 注:新增本質上就是在連續的空間插入新的資料,我目前已知兩種 - 第一種,就是先將從陣列的尾部位置開始依次將資料向後移動一位,將index所指向的位置騰出來,方便插入新的資料。如圖所示,先後依次移動 `55 44 33 `,這樣,位置就空出來,切忌不能先移動`33`,如果先移動 `33`,則`33`會直接覆蓋掉`44`。程式碼如下 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200516205703407.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYW5nZ3VzaGVubG9uZw==,size_16,color_FFFFFF,t_70) - 第二種,就是直接將指定index位置的資料直接取出,放到陣列的末尾,這樣就避免了陣列的整體移動,當資料量很大的時候,可以考慮這種做法。 ```java /** * 根據索引在指定位置插入資料 * @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索引刪除的位置開始,後面的元素依次向前移動一位,將前面的覆蓋掉就行了。但是依然需要移動索引之後的每一個元素。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200516210937351.png) - 第二種:最簡單的就是,直接將陣列的最後一位元素放入 `index`的位置,這樣就減少了資料的移動 ```java /** * 刪除指定位置的數 * @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; } ``` #### 查詢:返回查詢成功之後資料的索引值 ```java /** * 陣列查詢 * @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; } ``` #### 修改 ```java /** * 修改替換指定位置的資料 * @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; } ``` #### 列印輸出:為了方便查詢效果,提供列印方法 ```java /** * 陣列列印 * */ protected void printAll(){ System.out.println("當前陣列實際長度:" + count); System.out.println("申請的陣列空間大小:" + size); for (int i = 0; i < count; i++) { System.out.println("位置:" + i + "----" + array[i]); } } ``` #### 測試 ```java 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_Algorit