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