Java數據結構總結

一:經過一些源碼展現各類數據結構的使用方法:
1.順序表
概念及結構 :
順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,通常狀況下采用數組存儲。在數組 上完成數據的增刪查改數組

public interface ISequence
{    //在pos位置插入val  
boolean add(int pos,Object data);   
//查找關鍵字key 找到返回key的下標,沒有返回null;   
int search(Object key);  
//查找是否包含關鍵字key是否在順序表當中(這個和search有點衝突)  
boolean contains(Object key);  
//獲得pos位置的值   
Object getPos(int pos); 
//刪除第一次出現的關鍵字key   
Object remove(Object key);  
//獲得順序表的長度    
int size();   
//打印順序表 
void display();  
//清空順序表以防內存泄漏   
void clear();
}

2.鏈表
概念:鏈表是一種物理存儲結構上非連續、非順序的存儲結構,數據元素的邏輯順序是經過鏈表中的引用鏈 接次序實現的 。數據結構

鏈表的種類:框架

  1. 無頭單向非循環鏈表:結構簡單,通常不會單獨用來存數據。實際中更可能是做爲其餘數據結構的子結 構,如哈希桶、圖的鄰接表等等。
    1. 帶頭循環單鏈表:結構較無頭單向非循環鏈表簡單。
    2. 不帶頭雙向循環鏈表:在Java的集合框架庫中LinkedList底層實現就是不帶頭雙向循環鏈表
// 一、無頭單向非循環鏈表實現
public interface ILinked
{    //頭插法 
void addFirst(int data);   
//尾插法   
void addLast(int data);   
//任意位置插入,第一個數據節點爲0號下標 
boolean addindex(int index,int data);   
//查找是否包含關鍵字key是否在單鏈表當中 
boolean contains(int key);
//刪除第一次出現關鍵字爲key的節點
    int remove(int key);  
        //刪除全部值爲key的節點 
        void removeAllKey(int key);  
        //獲得單鏈表的長度    
        int getLength();  
        void display();    
        void clear(); 
        }
//二、帶頭循環單鏈表實現
public interface ICLinked
{    //頭插法   
void addFirst(int data);  
//尾插法   
void addLast(int data); 
//任意位置插入,第一個數據節點爲0號下標  
boolean addindex(int index,int data);   
//查找是否包含關鍵字key是否在單鏈表當中   
boolean contains(int key);   
//刪除第一次出現關鍵字爲key的節點   
int remove(int key);    
//刪除全部值爲key的節點  
void removeAllKey(int key); 
//獲得單鏈表的長度  
int getLength(); 
void display();   
void clear();
}
/ 三、不帶頭雙向鏈表實現
public interface IDoubleLinked 
{    //頭插法  
void addFirst(int data);   
//尾插法   
void addLast(int data);
//任意位置插入,第一個數據節點爲0號下標   
boolean addindex(int index,int data);  
//查找是否包含關鍵字key是否在單鏈表當中  
boolean contains(int key);   
//刪除第一次出現關鍵字爲key的節點  
int remove(int key);   
//刪除全部值爲key的節點   
void removeAllKey(int key); 
//獲得單鏈表的長度   
int getLength();  
void display();   
void clear(); 
}

3.棧
棧的概念及結構
棧:一種特殊的線性表,其只容許在固定的一端進行插入和刪除元素操做。進行數據插入和刪除操做的一端 稱爲棧頂,另外一端稱爲棧底。棧中的數據元素遵照後進先出LIFO(Last In First Out)的原則。 壓棧:棧的插入操做叫作進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操做叫作出棧。出數據也在棧頂。
棧的實現通常可使用數組或者鏈表實現,相對而言數組的結構實現更優一些。由於數組在尾上插入數據的 代價比較小ide

interface MyStack
{    // 判斷這個棧是否爲空棧 
boolean empty();        
// 返回棧頂元素,但不出棧  
int peek();    
// 返回棧頂元素,而且出棧    
int pop();        
// 將 item 壓入棧中 
void push(int item);   
// 返回元素個數    
int size(); 
}

4.隊列
隊列的概念及結構
隊列:只容許在一端進行插入數據操做,在另外一端進行刪除數據操做的特殊線性表,隊列具備先進先出 FIFO(First In First Out) 入隊列:進行插入操做的一端稱爲隊尾 出隊列:進行刪除操做的一端稱爲隊頭。
隊列的實現
隊列也能夠數組和鏈表的結構實現,使用鏈表的結構實現更優一些,由於若是使用數組的結構,出隊列在數 組頭上出數據,效率會比較低。指針

interface IMyQueue
{    // 判斷這個隊列是否爲空  
boolean empty();    
// 返回隊首元素,但不出隊列  
int peek();    
// 返回隊首元素,而且出隊列  
int poll();  
// 將 item 放入隊列中 
void add(int item);    
// 返回元素個數  
int size(); 
}

5:二叉樹
一棵二叉樹是結點的一個有限集合,該集合或者爲空,或者是由一個根節點加上兩棵別稱爲左子樹和右子樹 的二叉樹組成。
1)二叉樹的特色:code

  1. 每一個結點最多有兩棵子樹,即二叉樹不存在度大於2的結點。
    1. 二叉樹的子樹有左右之分,其子樹的次序不能顛倒

2)特殊的二叉樹: 隊列

  1. 滿二叉樹:一個二叉樹,若是每個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是 說,若是一個二叉樹的層數爲K,且結點總數是(2^k) -1 ,則它就是滿二叉樹。
    1. 徹底二叉樹:徹底二叉樹是效率很高的數據結構,徹底二叉樹是由滿二叉樹而引出來的。對於深度爲K 的,有n個結點的二叉樹,當且僅當其每個結點都與深度爲K的滿二叉樹中編號從1至n的結點一一對 應時稱之爲徹底二叉樹。 要注意的是滿二叉樹是一種特殊的徹底二叉樹。

3)二叉樹的存儲結構
二叉樹通常可使用兩種結構存儲,一種順序結構,一種鏈式結構
1.二叉樹順序存儲在 物理上是一個數組,在邏輯上是一顆二叉樹。內存

  1. 鏈式存儲: 二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即
    用鏈來指示元素的邏輯關係。 一般的方法是鏈表 中每一個結點由三個域組成,
    數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在
    的鏈結 點的存儲地址 。
    class Node {  
    int value;    // 結點中的數據域    
    Node leftChild;    // 保存左孩子結點 
    Node rightChild;   // 保存右孩子結點
    }

    (1)二叉樹的順序存儲結構:通常是一顆徹底二叉樹。
    引入堆的概念:(利用數組的存儲結構,存放一顆徹底二叉樹)
    堆的概念及結構
    若是有一個關鍵碼的集合K = {k0,k1, k2,…,kn-1},把它的全部元素按徹底二叉樹的順序存儲方式存儲 在一個一維數組中,並知足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,則稱爲 小堆(或大堆)。將根節點最大的堆叫作最大堆或大根堆,根節點最小的堆叫作最小堆或小根堆。
    堆的性質:
    堆中某個節點的值老是不大於或不小於其父節點的值; 堆老是一棵徹底二叉樹。rem

(2)二叉樹的鏈式存儲結構。get

// 結點個數
int getSize(Node root);

// 葉子結點個數
int getLeafSize(Node root);

// 第 k 層結點個數
int getKLevelSize(Node root, int k);

// 查找,依次在二叉樹的 根、左子樹、右子樹 中查找 value,若是找到,
返回結點,不然返 null
Node find(Node root, int value);
相關文章
相關標籤/搜索