資料結構與算法系列(一)陣列實現
阿新 • • 發佈:2020-05-17
## 資料結構與算法系列(一)陣列實現
注:`這是一個新的系列,主要是由於資料結構與演算法是程式設計師以後立身的根本,我以前在大學也學過,但是很快就忘記了,現在想把它撿起來,通過寫一個系列文章,加深自己的理解,其實我寫這個系列主要是想先通過預熱,然後去刷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