一、分析
什么是順序表?順序表是指用一組地址連續的存儲單元依次存儲各個元素,使得在邏輯結構上相鄰的數據元素存儲在相鄰的物理存儲單元中的線性表。一個標准的順序表需要實現以下基本操作:
1、初始化順序表
2、銷毀順序表
3、清空順序表
4、檢測順序表是否為空
5、返回順序表的元素個數
6、返回順序表中指定位置元素的值
7、返回順序表中第一個與指定值相同的元素的位置
8、返回指定元素的直接前驅
9、返回指定元素的直接后繼
10、向指定位置插入元素
11、刪除指定位置的元素
12、遍歷順序表
在Java中,可以借助數組來表示一組地址連續的存儲單元,通過對數組進行操作來表示對順序表進行操作。我們可以將順序表定義成一個類,將順序表的基本操作定義成類的方法,初始化順序表就是將這個類實例化成對象,銷毀順序表就是銷毀對象。
二、實現
1、定義類屬性和構造函數
1 class InitList{ 2 3 private int length; //順序表長度,表示順序表中的元素個數 4 5 private int [] list; //數組,順序表主體 6 7 public InitList(int max){ //構造函數,用來初始化順序表時定義順序表的最大長度 8 this.list = new int[max]; 9 this.length = 0; 10 } 11 }
2、清空順序表
1 public void clearList() { 2 this.length = 0; //由於是用length屬性來表示順序表中的元素個數,所以清空順序表只需將length置零即可 3 }
3、檢測順序表是否為空
1 public boolean listEmpty() { 2 if(this.length == 0) { //通過判斷length屬性是否為零,即可判斷順序表是否為空 3 return true; 4 }else { 5 return false; 6 } 7 }
4、返回順序表的元素個數
1 public int listLength() { 2 return this.length; //同上返回length值即可 3 }
5、返回順序表中指定位置元素的值
1 public int [] getElem(int site) { 2 3 int [] ret = new int[1]; //用來存儲獲取的值 4 5 if(site < 1 || site > this.length) { //檢測輸入的位置是否合法 6 return null; 7 } 8 9 ret[0] = this.list[site - 1]; //獲取指定位置的值 10 return ret; 11 }
6、返回順序表中第一個與指定值相同的元素的位置
1 public int locateElem(int value) { 2 3 for (int i = 0; i < this.length; i++) { //遍歷順序表 4 if(this.list[i] == value) { //逐值比較,如果相同,返回此元素所在位置 5 return i + 1; 6 } 7 } 8 return 0; //如未找到,返回零 9 }
7、返回指定元素的直接前驅
1 public int [] priorElem(int value) { 2 3 int [] ret = new int[this.length]; //定義一個與順序表同等長度的數組,用來存儲找到的直接前驅 4 int in = 1; //從數組的第二個位置開始存儲找到的直接前驅,第一個空間用來存儲找到的直接前驅的個數 5 6 for(int i = 1; i < this.length; i++) { //遍歷順序表 7 if(this.list[i] == value) { //逐值比較,如果相等,存儲其直接前驅到數組中 8 ret[in] = this.list[i - 1]; 9 in++; 10 } 11 } 12 13 if(in != 1) { //判斷是否找到了直接前驅 14 ret[0] = in - 1; //將直接前驅的個數存入數組中 15 return ret; 16 }else { 17 return null; 18 } 19 }
8、返回指定元素的直接后繼
1 public int [] nextElem(int value) { //代碼邏輯同直接前驅,此處不再贅述 2 3 int [] ret = new int[this.length]; 4 int in = 1; 5 6 for(int i = 0; i < this.length - 1; i++) { 7 if(this.list[i] == value) { 8 ret[in] = this.list[i + 1]; 9 in++; 10 } 11 } 12 13 if(in != 1) { 14 ret[0] = in - 1; 15 return ret; 16 }else { 17 return null; 18 } 19 }
9、向指定位置插入元素
1 public int listInsert(int site,int value) { 2 3 if(site < 1 || site > this.length + 1) { //判斷輸入的位置是否合法 4 return -1; 5 }else if(this.length == this.list.length) { //判斷順序表是否已滿 6 return -2; 7 } 8 9 for(int i = this.length - 1; i >= site - 1; i--) { //從順序表的最后一個元素開始,逐個向后移動一位,直到要插入元素的位置,為要插入的元素騰出空間 10 this.list[i+1] = this.list[i]; 11 } 12 13 this.list[site - 1] = value; //插入元素 14 this.length++; //順序表長度加一 15 return 0; 16 }
10、刪除指定位置的元素
1 public boolean listDelete(int site) { 2 if(site < 1 || site > this.length) { //判斷輸入的位置是否合法 3 return false; 4 }else if(site == this.length) { //如果要刪除的是最后一個元素,直接將順序表長度減一即可 5 this.length--; 6 return true; 7 }else { 8 for (int i = site - 1; i < this.length; i++) { //從要刪除元素的位置開始,將后面的元素逐個向前移動一位,填補刪除元素后的空缺 9 this.list[i] = this.list[i + 1]; 10 } 11 this.length--; //順序表長度減一 12 return true; 13 } 14 }
11、遍歷順序表
public String traverseList() { //遍歷順序表並輸出 String s = ""; //用來存儲順序表中的值 for (int i = 0; i < this.length; i++) { //遍歷順序表,存入字符串中 s += this.list[i] + "、"; } if(s.length() == 0) { //如果順序表為空,直接返回空字符串 return s; } return s.substring(0,s.length() - 1); //刪去最后一個頓號 }
三、小結
以上就是順序表用Java的完整實現,由於只定義了整數的數組,因此只能操作整數數據,但順序表的基本思想都已實現。