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