注:定義來源於
《數據結構(C++版)(王紅梅/胡明/王濤 編著)》 第2版。
1.字符串
1.1 定義
字符串(string,簡稱串)是零個或多個字符組成的有限序列,只包含空格的串稱爲空格串。
1.2 字符串的存儲結構
字符串是數據元素爲單個字符的線性表,一般採用順序存儲。類似於順序表,字符串的順序存儲結構是用數組來存儲串中的字符序列。在Pascal、C?C++、java等語言中,字符串都是採用順序存儲。
2 數組
2.1 定義
數組(array)是由類型相同的數據元素構成的有序集合,每個數據元素稱爲一個數組元素…。數組是一個具有固定格式和數量的數據集合,在數組上一般不能執行插入或者刪除某個元素的操作。因此,除了初始化和銷燬之外,在數組中通常只有兩種操作:1.讀操作;2.寫操作。這兩種操作本質上對應一種操作-------尋址(關於尋址,讀者最好看一下原書。),即根據一組下標定位相應的數組元素。
2.2 數組的創建、賦值
//創建數組,並設置長度
int[] arr1 = new int[3];
//給數組賦值,注意,下標是從0開始
arr1[0] = 110;
arr1[1] = 111;
arr1[2] = 112;
//訪問數組中的元素
int elem1 = arr1[0];
//獲取數組的長度
int length = arr1.length;
//創建數組並賦值
int[] arr2 = new int[]{210, 211, 212, 213};
2.3 添加元素
// 1:創建一個新數組,新數組的長度是原數組的長度+1
// 2:然後把原數組copy到新數組最後;
// 3:把目標元素添加到新數組中;
// 4:把新數組替換原數組
int addElem = 214;
int[] newArr = new int[arr2.length + 1];
for (int i = 0; i < arr2.length; i++) {
newArr[i] = arr2[i];
}
newArr[arr2.length] = addElem;
arr2 = newArr;
System.out.print(Arrays.toString(arr2));
2.4 刪除數組中的元素
在指定位置添加一個元素,和這個原理類似,不寫嘍就。
// 1.創建一個新數組,長度是原數組長度-1,
// 2.複製原數組中除了要刪除元素以外的元素,
// 3.新數組替換原數組
int[] arr3 = new int[]{210, 211, 212, 213,214};
int deletPos = 2;//要刪除元素下標
int[] arr4 = new int[arr3.length - 1];
for (int i = 0; i < arr4.length; i++) {
if (i < deletPos) {
arr4[i] = arr3[i];
}else {
arr4[i] = arr3[i +1];
}
}
arr3 = arr4;
System.out.print(Arrays.toString(arr3));
4.線性查找
查找元素target的下標,如果數組內有元素target,則返回相應下標,否則,返回-1.
線性查找缺點很明顯,效率低。
int[] arr5 = new int[]{0, 2, 3, 4, 5, 6, 7, 8, 9, 99};
int target = 8;
int index = -1;
for (int i = 0; i < arr5.length; i++) {
if (arr5[i] == target) {
index = i;
break;
}
}
System.out.print(index);
5. 二分法查找
查找元素target的下標,如果數組內有元素target,則返回相應下標,否則,返回-1.
優點很明顯,查找速度快。缺點當然也很明顯,目標數組是有序的。
int[] arr6 = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
int target = 7;
int intex = -1;//目標位置
int begin = 0;//開始位置
int end = arr6.length - 1;
int mid = (begin + end) / 2;
//開始在結束位置之後或者重合,表示沒有這個元素
if (begin >= end) {
return -1;
}
while (true) {
if (arr6[mid] == target) {
intex = mid;
break;
} else {
if (arr6[mid] > target) {
end = mid - 1;
} else {
begin = mid + 1;
}
}
mid = (begin + end) / 2;
}
return intex;