1. 程式人生 > >JAVA基礎(62)---線性結構和線性表的實現

JAVA基礎(62)---線性結構和線性表的實現

線性結構的定義

若結構是非空有限集,則有且僅有一個開始結點和一個終端結點,並且所有結點都最多隻有一個直接前趨和一個直接後繼。
可表示為:(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);
		
		
	}
}

順序表的優缺點

優點:

  • 儲存密度大(結點本身所佔儲存量/結點結構所佔儲存量)
  • 可以隨機存取表中任一元素

缺點:

  • 在插入、刪除某一元素時,需要移動大量元素
  • 浪費儲存空間
  • 屬於靜態儲存形式,資料元素的個數不能自由擴充