JAVA基礎(62)---線性結構和線性表的實現
阿新 • • 發佈:2018-11-19
線性結構的定義
若結構是非空有限集,則有且僅有一個開始結點和一個終端結點,並且所有結點都最多隻有一個直接前趨和一個直接後繼。
可表示為:(a1 , a2 , ……, an)
線性結構的特點
① 只有一個首結點和尾結點;
② 除首尾結點外,其他結點只有一個直接前驅和一個直接後繼
簡言之,線性結構反映結點間的邏輯關係是 一對一的
線性結構包括線性表、堆疊、佇列、字串、陣列等等,其中,最典型、最常用的是線性表
線性表的定義
同一線性表中的元素必定具有相同特性
線性表的重要基本操作
初始化、取值、查詢、插入、刪除
取值:根據位置 i 獲取相應位置資料元素的內容
查詢:根據指定資料獲取資料所在的位置
插入:插在第 i 個結點之前
刪除:刪除第 i 個結點
線性表的實現
線性表(容器):本質:就是一個物件陣列
模板:
public class MyArrayList<E> { private Object[] data; // 儲存線性表資料的陣列 private int capacity; // 線性表目前的容量 private int size; // 線性表的元素個數 /** * 初始化未宣告大小,宣告為10 */ public MyArrayList() { this(10); } /** * 初始化線性表,宣告陣列的大小 * @param initSize 線性表的初始化大小 */ public MyArrayList(int initSize) { if (initSize >= 0) { data = new Object[initSize]; capacity = initSize; size = 0; } else { throw new RuntimeException("初始化大小不能小於0: " + initSize); } } /** * 判斷當前線性表是否為空 * @return */ public boolean isEmpty() { if (size > 0) { return false; } else { return true; } } /** * 返回當前線性表的大小 * @return */ public int capacity() { return size; } /** * 清空當前線性表 */ public void empty() { data = null; capacity = 0; size = 0; } /** * 末位新增新元素 * @param e 元素e */ public boolean add(E e) { validatecp(); data[size] = e; size++; return true; } /** * 判斷是否超出容量,即size是否超出capacity,如果超出則擴容 */ private void validatecp() { if (size == capacity) { capacity *= 2; Object[] temp = new Object[capacity]; for (int i = 0; i < size; i++) { temp[i] = data[i]; } data = temp; } } /** * 判斷下標是否在正常範圍內 * @param index 接收的下標引數 */ private void validateindex(int index) { if (index < 0 || index > size) { throw new RuntimeException("無效的下標: " + index); } } /** * 取得某個位置元素 * @param index 下標引數 * @return */ public E getElement(int index) { validateindex(index); return (E) data[index]; } /** * 在指定的位置插入元素 * @param index 元素的插入位置 * @param e 元素 * @return */ public boolean insert(int index, E e) { validateindex(index); validatecp(); for (int i = size; i > index; i--) { data[i] = data[i - 1]; } data[index] = e; size++; return true; } /** * 刪除指定位置的元素 * @param index 待刪除元素下標 * @return */ public boolean delete(int index) { validateindex(index); for (int i = index; i < size; i++) { data[i] = data[i + 1]; } data[size - 1] = null; size--; return true; } @Override public String toString() { String str = "[ "; for (Object e : data) { if (e != null) { str = str + e + " "; } } str = str + "]"; return str; } }
自己建立一個線性表:
/**
*
* @author Admin
*
*/
public class LanqiaoArrayList {
/*
* 儲存元素
*/
private Object[] data;
/*
*線性表的容量
*/
private int capacity;
/*
*線性表中元素的個數
*/
private int size;
/*
* 不指定線性表的容量,採用預設值
*/
public LanqiaoArrayList() {
data = new Object[10];
capacity = 10;
size = 0 ;
}
/**
* 指定線性表的容量
* @param initCapacity 線性表容量
*/
public LanqiaoArrayList(int initCapacity) {
if(initCapacity >= 0) {
data = new Object[initCapacity];
capacity = initCapacity;
size = 0;
}else {
System.out.println("線性表的容量不能為負數:" + initCapacity);
}
}
/*
* 獲取線性表的容量
*/
public int getCapacity() {
return this.capacity;
}
/*
* 獲取線性表中元素的個數
*/
public int getSize() {
return this.size;
}
/*
* 判斷線性表是否為空
*/
public boolean isEmpty() {
if(size > 0 ) {
return false;
}else {
return true;
}
}
/*
* 清空線性表
* 1 將中個數組全部刪除
* 2 將陣列中的元素全部刪除
*/
public void clear() {
/*data = null;
capacity = 0;
size = 0 ;*/
if(size > 0 ) {
for(int i = 0 ; i < size; i++) {
data[i] = null;
}
size = 0 ;
}
}
/*
* 獲取某一元素
*/
public Object getElement(int index) {
if(index < capacity) {
return data[index];
}else {
System.out.println("你輸入的索引超出了範圍");
return null;
}
}
/*
* 末位新增一個元素到線性表中
* 如果size = capacity 告訴使用者,線性表已滿
* 如果size = capacity 實現自動擴容
*/
public void addElement(Object obj) {
validatecp();
data[size++] = obj;
}
/*
* 驗證線性表的容量
*/
public void validatecp(){
if(size == capacity) {
capacity = capacity * 2;
Object[] newData = new Object[capacity];
for(int i = 0 ; i < data.length;i++) {
newData[i] = data[i];
}
data = newData;
}
}
/*
* 刪除指定的元素
*/
public void deleteEle(int index) {
if(validateIndex(index)) {
for (int i = index; i < size; i++) {
data[i] = data[i + 1];
}
data[size- 1] = null;
size-=1;
}
}
/*
* 判斷給出的索引是否有效
*/
public boolean validateIndex(int index) {
if(index < 0 || index > size ) {
System.out.println("索引無效");
return false;
}
return true;
}
/*
* 插入一個元素到指定的位置
*/
public void insertEle(int index,Object ele) {
if(validateIndex(index)) {
validatecp();
for(int i = size; i > index;i--) {
data[i] = data[i - 1];
}
data[index]= ele;
size += 1;
}
}
/*
* 查詢某一個元素:如果該元素存在,則返回元素的下標 如果不存在 則返回-1
*/
public int searchElE(Object obj) {
for(int i = 0 ; i < size ; i++) {
if(data[i] == obj && data[i].equals(obj)) {
return i;
}
}
return -1;
}
public void printArrayList() {
for(int i = 0 ; i < size; i++) {
System.out.println(data[i]);
}
}
}
public class Test {
public static void main(String[] args) {
LanqiaoArrayList lal = new LanqiaoArrayList(5);
System.out.println(lal.getCapacity());
System.out.println("-------------------");
lal.addElement(1);
lal.addElement(2);
lal.addElement(3);
lal.addElement(4);
lal.addElement(5);
lal.addElement(6);
lal.printArrayList();
System.out.println("------------------");
lal.insertEle(2, "aaaa");
lal.printArrayList();
System.out.println("------------");
int i = lal.searchElE("aaaaa");
System.out.println(i);
}
}
順序表的優缺點
優點:
- 儲存密度大(結點本身所佔儲存量/結點結構所佔儲存量)
- 可以隨機存取表中任一元素
缺點:
- 在插入、刪除某一元素時,需要移動大量元素
- 浪費儲存空間
- 屬於靜態儲存形式,資料元素的個數不能自由擴充