1. 程式人生 > >基於陣列的容器類實現 和 基於連結串列結構的容器類實現

基於陣列的容器類實現 和 基於連結串列結構的容器類實現

1. 資料結構
  概念 :資料結構是計算機儲存、組織資料的方式。
    簡單理解:可以看成是對資料儲存的一種方式
  儲存方式   :

    1.變數
       2.陣列
    3.自定義容器

連結串列是一種線性的資料結構
是一種最簡單的動態資料結構 

優點: 動態建立,節省空間,頭部新增容易

缺點:空間上不連續,查詢困難。只能從頭開始一個一個找

2.  基於陣列的容器類實現  

package 基於陣列的容器類實現;

import java.util.Arrays;

public class Container { private int num = 0; //容器類儲存元素的個數 private Object [] contain; //定義個儲存任何型別的容器 // 無參的構造方法 public Container(){ this(5); } //有參的構造方法 public Container(int length){ this.contain = new Object[length]; } //獲取容器元素個數 public int getNum(){
return num; } //給容器新增元素 public void add(Object value){ if(num == this.contain.length){ Object[] temp = new Object[this.contain.length*2]; //擴容 System.arraycopy(contain, 0, temp, 0, num); this.contain = temp; } contain[num] = value; num
++; } //重寫toString 方法 public String toString(){ Object[] temp =Arrays.copyOf(contain, num); return Arrays.toString(temp); } //容器的其他方法 //1.根據下標獲取元素 public Object getElementByIndex(int index){ if(index>=0 && index<num){ return contain[index]; } return -1; } //2.獲取元素第一次出現的位置的下標 public int firstIndex(Object obj){ for (int i = 0; i < contain.length; i++) { if(obj.equals(contain[i])){ return i; } } return -1; } //3.通過指定出現的次數,查詢指定元素的下標 public int indexOf(Object obj,int count){ for (int i = 0; i < contain.length; i++) { if(obj.equals(this.contain[i])){ count--; if(count==0){ return i; } } } return -1; } //4.指定索引 刪除對應位置上的元素 public void delete(int index){ if(index>=0 && index<num){ this.contain[index] = null; //將null值後的所有元素依次向前移一位 for (int i = index; i < contain.length-1; i++) { this.contain[i] = this.contain[i+1]; } Object[] temp = new Object[num]; temp = Arrays.copyOf(contain,temp.length-1); this.contain = temp; num--; } } //5.刪除 第一次出現 的指定元素 public void deleteFirstElement(Object obj){ if(firstIndex(obj) != -1){ delete(firstIndex(obj)); } } //6.刪除 所有的指定元素 核心思想:永遠刪除的是第一個元素,直到容器中沒有該指定元素(返回負數) public void deleteElement(Object obj){ while(firstIndex(obj) != -1){ delete(firstIndex(obj)); } } //7.刪除 所有元素 public void empty(){ this.num = 0; Arrays.fill(contain, null); } }

3.基於連結串列結構的容器類實現

package 基於連結串列的容器類實現;
/*
 * 容器類: 儲存 :1. 第一個節點的引用(地址),根據這個地址能夠找到下一個節點。
 *               2. 節點的個數。
 */
public class LinkList {
    private Node first;
    private int size;
    //容器類新增元素的方法
    public void add(Object obj){
        //1. 將要新增的元素封裝到 節點類中、
        Node ele = new Node(obj);
        //2.當first引用為null時,直接將first指向 上面建立的ele物件(裡面儲存了要新增的元素)。
        //  當first引用指向了 一個Node類中的物件,先將first引用儲存到Node類中temp這個引用變數(相當於獲取了第一個節點)。
        //然後通過while迴圈判斷temp.getNext(),即這個物件的下一個引用節點是否為null,如果不為空,將 temp.getNext()賦給temp,繼續迴圈判斷。
        // 直到節點的  next引用 為null時,ele物件儲存的下一個引用節點中。 外圍 size++
        if (first == null) {
            first = ele;
        }else{
            Node temp = first; //獲取第一個節點
            while(temp.getNext() != null){
                temp = temp.getNext();
            }
            temp.setNext(ele);
        }
        size++;
    }
//重寫toString方法,列印容器類的所有元素
    public String toString(){
        StringBuffer sb = new StringBuffer("[");
        Node temp = first;
        while(temp.getNext()!=null){
            sb.append(temp.getObj()+"  ");
            temp = temp.getNext();
        }
        sb.append(temp.getObj()+"]");
        return sb.toString();
    }
}
package 基於連結串列的容器類實現;
/**
 * 節點類:儲存  節點資料元素  和   下一個節點的引用。
 *作用:我想再強調一下資料結構的作用是為資料尋找一個合適的載體,讓資料的操作更加快捷。
        Node只不過是一個輔助工具,並不會暴露在外。它與資料相對應,又使資料按鏈式排布,
        操縱節點也就等於操縱資料,就像提線木偶,我們操作的是"觀眾"所看不見的線,而不是木偶的各個肢體本身
 */
public class Node {
    private Object obj;  //節點資料元素
    private Node next;   //下一個節點的引用(地址)
    
//setter/getter方法    
    public Object getObj() {
        return obj;
    }
    public void setObj(Object obj) {
        this.obj = obj;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }

//有參的構造方法,給節點元素賦值。
    public Node(Object obj){
        this.obj = obj;
    }
}