Java線性表(順序儲存)——陣列實現
第一次寫部落格,最近一直在研究資料結構,最開始準備用c語言寫資料資料結構的東西的,發現用c真的寫得我頭痛,果斷用了我喜歡的java實現,其實懂了過後用什麼語言寫都一樣的。不說了,直接上程式碼!
1.定義介面
抽象資料型別的List介面
public interface List { //返回線性表的大小,即資料元素的個數 public int getSize(); //判斷線性表是否為空 public boolean isEmploy(); //判斷線性表是否包含元素e public boolean contains(Object se); //返回資料元素e線上性表中的序號,若不存在返回-1
2.定義異常
出現越界發生該異常
public class OutOfBoundaryException extends RuntimeException{
public OutOfBoundaryException(String err){ super(err); } }
3.用陣列實現
public class ListArray implements List {
// 陣列預設大小 private final int LEN = 8;
// 陣列元素的比較策略(沒用上,用的系統的比較方法) // private Strategy strategy;
// 線性表中元素的個數 private int size;
// 資料元素陣列 private Object[] elements;
public ListArray() { }
public ListArray(int size) { // this.strategy = strategy; this.size = size; elements = new Object[LEN]; }
/* * 返回線性表大小 */ public int getSize() { return size; }
/* * 判斷線性表是否為空 */ public boolean isEmploy() { return size == 0; }
/* * 判斷線性表是否包含元素e */ public boolean contains(Object e) { for (int i = 0; i < size; i++) { if (e.equals(elements[i])) return true; } return false; }
/* * 返回元素e線上性表中的序號 */ public int indexOf(Object e) { for (int i = 0; i < size; i++) if (e.equals(elements[i])) return i; return -1; }
/* * 線上性表的i個序號位置插入元素e */ public void insert(int i, Object e) throws OutOfBoundaryException { if (i < 0 || i > size) throw new OutOfBoundaryException("越界異常"); if (size >= elements.length) expandSpace();// 表滿了,擴容兩倍 for (int j = size; j > i; j--) elements[j] = elements[j - 1]; elements[i] = e; size++; return; }
/* * 陣列擴容兩倍 */ public void expandSpace() { Object[] a = new Object[elements.length * 2]; for (int i = 0; i < elements.length; i++) a[i] = elements[i]; elements = a; }
/* * 將資料e插入到元素obj之前 */ public boolean insertBefor(Object obj, Object e) { int i = indexOf(obj); System.out.println(i); if (i < 0) return false; insert(i, e); return true; }
/* * 將資料e插入到元素obj之後 */ public boolean insertAfter(Object obj, Object e) { int i = indexOf(obj); if (i < 0) return false; insert(i + 1, e); return true; }
/* * 刪除序號為i的那個元素 */ public Object remove(int i) throws OutOfBoundaryException { if (i < 0 || i > size) { throw new OutOfBoundaryException("輸入的數越界"); } Object obj = elements[i]; for (int j = i; j < size - 1; j++) elements[j] = elements[j + 1]; // elements[--size] = null;//?我用size--替換 size--; return obj; }
/* * 刪除線性表第一個與e相同的元素 */ public boolean remove(Object e) { int i = indexOf(e); if (i < 0) return false; remove(i); return true; }
/* * 替換序號為i的元素e */ public Object replace(int i, Object e) throws OutOfBoundaryException { if (i < 0 || i > size) throw new OutOfBoundaryException("輸入越界"); Object obj = elements[i]; elements[i] = e; return obj; }
/* * 返回序列號為i的元素 */ public Object get(int i) throws OutOfBoundaryException { if (i < 0 || i > size) throw new OutOfBoundaryException("陣列越界"); return elements[i]; }
}