溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么掌握Java數(shù)據(jù)結(jié)構(gòu)

發(fā)布時間:2021-11-03 18:10:53 來源:億速云 閱讀:107 作者:iii 欄目:編程語言

這篇文章主要介紹“怎么掌握Java數(shù)據(jù)結(jié)構(gòu)”,在日常操作中,相信很多人在怎么掌握Java數(shù)據(jù)結(jié)構(gòu)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么掌握Java數(shù)據(jù)結(jié)構(gòu)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

一:通過一些源碼展示各種數(shù)據(jù)結(jié)構(gòu)的使用方法:
1.順序表
概念及結(jié)構(gòu) :
順序表是用一段物理地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu),一般情況下采用數(shù)組存儲。在數(shù)組 上完成數(shù)據(jù)的增刪查改

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

2.鏈表
概念:鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的引用鏈 接次序?qū)崿F(xiàn)的 。

鏈表的種類:

  1. 無頭單向非循環(huán)鏈表:結(jié)構(gòu)簡單,一般不會單獨用來存數(shù)據(jù)。實際中更多是作為其他數(shù)據(jù)結(jié)構(gòu)的子結(jié) 構(gòu),如哈希桶、圖的鄰接表等等。

    1. 帶頭循環(huán)單鏈表:結(jié)構(gòu)較無頭單向非循環(huán)鏈表簡單。

    2. 不帶頭雙向循環(huán)鏈表:在Java的集合框架庫中LinkedList底層實現(xiàn)就是不帶頭雙向循環(huán)鏈表

// 1、無頭單向非循環(huán)鏈表實現(xiàn)
public interface ILinked
{    //頭插法 
void addFirst(int data);   
//尾插法   
void addLast(int data);   
//任意位置插入,第一個數(shù)據(jù)節(jié)點為0號下標 
boolean addindex(int index,int data);   
//查找是否包含關(guān)鍵字key是否在單鏈表當中 
boolean contains(int key);
//刪除第一次出現(xiàn)關(guān)鍵字為key的節(jié)點
    int remove(int key);  
        //刪除所有值為key的節(jié)點 
        void removeAllKey(int key);  
        //得到單鏈表的長度    
        int getLength();  
        void display();    
        void clear(); 
        }
//2、帶頭循環(huán)單鏈表實現(xiàn)
public interface ICLinked
{    //頭插法   
void addFirst(int data);  
//尾插法   
void addLast(int data); 
//任意位置插入,第一個數(shù)據(jù)節(jié)點為0號下標  
boolean addindex(int index,int data);   
//查找是否包含關(guān)鍵字key是否在單鏈表當中   
boolean contains(int key);   
//刪除第一次出現(xiàn)關(guān)鍵字為key的節(jié)點   
int remove(int key);    
//刪除所有值為key的節(jié)點  
void removeAllKey(int key); 
//得到單鏈表的長度  
int getLength(); 
void display();   
void clear();
}
/ 3、不帶頭雙向鏈表實現(xiàn)
public interface IDoubleLinked 
{    //頭插法  
void addFirst(int data);   
//尾插法   
void addLast(int data);
//任意位置插入,第一個數(shù)據(jù)節(jié)點為0號下標   
boolean addindex(int index,int data);  
//查找是否包含關(guān)鍵字key是否在單鏈表當中  
boolean contains(int key);   
//刪除第一次出現(xiàn)關(guān)鍵字為key的節(jié)點  
int remove(int key);   
//刪除所有值為key的節(jié)點   
void removeAllKey(int key); 
//得到單鏈表的長度   
int getLength();  
void display();   
void clear(); 
}

3.棧
棧的概念及結(jié)構(gòu)
棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數(shù)據(jù)插入和刪除操作的一端 稱為棧頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進先出LIFO(Last In First Out)的原則。 壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數(shù)據(jù)在棧頂。
出棧:棧的刪除操作叫做出棧。出數(shù)據(jù)也在棧頂。
棧的實現(xiàn)一般可以使用數(shù)組或者鏈表實現(xiàn),相對而言數(shù)組的結(jié)構(gòu)實現(xiàn)更優(yōu)一些。因為數(shù)組在尾上插入數(shù)據(jù)的 代價比較小

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

4.隊列
隊列的概念及結(jié)構(gòu)
隊列:只允許在一端進行插入數(shù)據(jù)操作,在另一端進行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進先出 FIFO(First In First Out) 入隊列:進行插入操作的一端稱為隊尾 出隊列:進行刪除操作的一端稱為隊頭。
隊列的實現(xiàn)
隊列也可以數(shù)組和鏈表的結(jié)構(gòu)實現(xiàn),使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組的結(jié)構(gòu),出隊列在數(shù) 組頭上出數(shù)據(jù),效率會比較低。

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

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

  1. 每個結(jié)點最多有兩棵子樹,即二叉樹不存在度大于2的結(jié)點。

    1. 二叉樹的子樹有左右之分,其子樹的次序不能顛倒

2)特殊的二叉樹:

  1. 滿二叉樹:一個二叉樹,如果每一個層的結(jié)點數(shù)都達到最大值,則這個二叉樹就是滿二叉樹。也就是 說,如果一個二叉樹的層數(shù)為K,且結(jié)點總數(shù)是(2^k) -1 ,則它就是滿二叉樹。


    1. 完全二叉樹:完全二叉樹是效率很高的數(shù)據(jù)結(jié)構(gòu),完全二叉樹是由滿二叉樹而引出來的。對于深度為K 的,有n個結(jié)點的二叉樹,當且僅當其每一個結(jié)點都與深度為K的滿二叉樹中編號從1至n的結(jié)點一一對 應(yīng)時稱之為完全二叉樹。 要注意的是滿二叉樹是一種特殊的完全二叉樹。

3)二叉樹的存儲結(jié)構(gòu)
二叉樹一般可以使用兩種結(jié)構(gòu)存儲,一種順序結(jié)構(gòu),一種鏈式結(jié)構(gòu)
1.二叉樹順序存儲在 物理上是一個數(shù)組,在邏輯上是一顆二叉樹。

  1. 鏈式存儲: 二叉樹的鏈式存儲結(jié)構(gòu)是指,用鏈表來表示一棵二叉樹,即
    用鏈來指示元素的邏輯關(guān)系。 通常的方法是鏈表 中每個結(jié)點由三個域組成,
    數(shù)據(jù)域和左右指針域,左右指針分別用來給出該結(jié)點左孩子和右孩子所在
    的鏈結(jié) 點的存儲地址 。

    class Node {  
    int value;    // 結(jié)點中的數(shù)據(jù)域    
    Node leftChild;    // 保存左孩子結(jié)點 
    Node rightChild;   // 保存右孩子結(jié)點
    }

    (1)二叉樹的順序存儲結(jié)構(gòu):一般是一顆完全二叉樹。
    引入堆的概念:(利用數(shù)組的存儲結(jié)構(gòu),存放一顆完全二叉樹)
    堆的概念及結(jié)構(gòu)
    如果有一個關(guān)鍵碼的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉樹的順序存儲方式存儲 在一個一維數(shù)組中,并滿足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,則稱為 小堆(或大堆)。將根節(jié)點最大的堆叫做最大堆或大根堆,根節(jié)點最小的堆叫做最小堆或小根堆。
    堆的性質(zhì):
    堆中某個節(jié)點的值總是不大于或不小于其父節(jié)點的值; 堆總是一棵完全二叉樹。

(2)二叉樹的鏈式存儲結(jié)構(gòu)。

// 結(jié)點個數(shù)
int getSize(Node root);

// 葉子結(jié)點個數(shù)
int getLeafSize(Node root);

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

// 查找,依次在二叉樹的 根、左子樹、右子樹 中查找 value,如果找到,
返回結(jié)點,否則返 null
Node find(Node root, int value);

到此,關(guān)于“怎么掌握Java數(shù)據(jù)結(jié)構(gòu)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI