第六章 資料結構

2021-09-13 17:17:47 字數 4327 閱讀 8484

存放同一種資料型別的多個元素的容器,通過索引(記憶體偏移量)進行元素的訪問,陣列的大小一旦確定就不能改變。陣列其實也是線性表結構,在記憶體中陣列的元素是緊挨著連續儲存的。

特點:查詢快、增刪慢

舉例:定義乙個陣列:int arr = new int;

想在2的後面插入乙個新的元素11,這時候就需要定義乙個新的陣列arr2,陣列arr2的長度是arr的長度+1,然後通過遍歷陣列arr,在2前面的元素還是按照之前的索引位置儲存在陣列arr2中,接著儲存2這個元素,在元素2之後先儲存11,剩下的元素一次把索引+1儲存到陣列arr2中。

把arr陣列中的元素3刪除,定義乙個新的陣列arr3,陣列arr3的長度是arr的長度-1,然後通過遍歷陣列arr,在元素3之前的元素還是按照之前的索引位置儲存到陣列arr3中,元素3之後的元素索引依次-1。

通過以上的例子,可以看出,陣列對元素的增刪比較繁瑣,速度慢,而查詢的速度則較快。

所謂的鍊錶指的是節點和節點之間無需再記憶體中物理連續的儲存,而是通過引用成員去指向下乙個節點的位置,這樣就可以在記憶體中動態的進行物件建立,鍊錶存放元素的數量僅受堆記憶體大小的限制,且無需在建立鍊錶的時候給定其容量大小。簡單的一句話就是鍊錶是由一條鍊子把多個節點連線起來組成的資料

特點:鍊錶解決了陣列增刪慢和陣列大小不可變更的問題,但是陣列獲取元素是通過記憶體偏移量(索引),鍊錶是通過節點和節點之間的引用建立關係獲取元素,因此陣列的查詢元素的速度要快於鍊錶。

舉例:在鍊錶中有元素1, 2, 3, 4, 5等元素,它們在鍊錶中的儲存方式如圖所示:

自定義乙個鍊錶結構類來儲存資料。

節點類:

public class node 

public node(string key, string value)

public string getkey()

public void setkey(string key)

public string getvalue()

public void setvalue(string value)

@override

public string tostring() ';}}

鍊錶類:
public class linknode 

// 如果head為null,表示此時列表為空,加進來的值就是head

if (head == null) else

if (current != null) else }}

/*** 根據key獲取節點元素

* @param key 鍵

* @return

*/public node getnode(string key)

node current = this.head;

// 如果current等於null,說明該節點不存在

// 如果key等於current中的key,說明當前節點就是需要查詢的節點,直接返回

while (current != null && !key.equals(current.getkey()))

return current;

}/**

* 根據key刪除節點元素

* @param key 鍵

* @return

*/public boolean delnode(string key)

boolean issuccess = false;

if (key.equals(head.getkey())) else

if (current != null)

}return issuccess;

}/**

* 在索引index處插入乙個節點元素

* @param node 節點元素

* @param index 索引

* @return

*/public boolean inertnode(node node, int index)

boolean issuccess = false;

if (index == 0) else

if (current != null)

}return issuccess;

}@override

public string tostring() ';}}

測試類:

public static void main(string args) }

棧也是一種線性表(物理或邏輯連續的),棧頂和棧底是標識棧的兩個端點。棧提供了「先進後出」 的資料結構。壓入(push)和彈出(pop)是棧的兩個基本操作。

示例:自定義棧類:

public class customstack 

/*** 判斷棧是否為空

*/public boolean isempty()

/*** 判斷棧是否滿

** @return

*/public boolean isfull()

/*** 入棧(往棧中新增資料)

** @param object

*/public void push(object object) else

}/**

* 出棧

** @return

*/public object pop() else

}/**

* 獲取棧的大小

* @return

*/public int size()

}

測試:

public static void main(string args)

system.out.println("stack.isempty():" + stack.isempty());

system.out.println("stack.isfull():" + stack.isfull());

}} 結果:for迴圈中的列印的結果順序:5、true、a、aa、1,彈出棧的順序跟入棧的順序相反。

佇列也是一種線性表,對頭和隊尾是它的兩個標誌,入隊(offer)和出隊(poll)是佇列的兩個基本操作。佇列提供了」先進先出「的資料結構。

示例(迴圈佇列):

自定義佇列類:

public class customqueue 

/*** 判斷佇列是否為空

** @return

*/public boolean isempty()

/*** 向後移動隊首或者隊尾的指向

** @param i

* @return

*/public int next(int i)

/*** 判斷佇列是否滿了

** @return

*/public boolean isfull()

/*** 入隊

** @param data

*/public void offer(object data) else

}/**

* 出隊

** @return

*/public object poll() else

}/**

* 佇列的大小

** @return

*/public int size()

}

測試類:

public static void main(string args)

system.out.println("customqueue.isfull():" + customqueue.isfull());

system.out.println("customqueue.isempty():" + customqueue.isempty());

}} 從**中可以看出,在定義佇列的大小是5的時候,但是實際儲存的資料個數要比定義的大小-1個。 是因為這是乙個迴圈佇列,必須要有乙個空的來區分隊頭和隊尾,在判斷佇列是否為空的時候,使用 的是頭的位置等於尾的位置,因此在用for迴圈出隊時,迴圈的次數應該小於佇列的大小-1。從結果 可以看出,佇列的儲存方式就是先進先出。

資料結構第六章樹

第六章 樹 1.樹是n個結點的有限集。n 0時稱為空樹。在任意乙個非空樹中 1 有且僅有乙個特定的稱為根的結點 2 當n 1時,其餘節點可分為m個互不相交的有限集,其中每乙個集合又是一棵樹,並成為根的子樹。2.結點分類 結點擁有的子樹稱為結點的度。度為0的結點稱為葉結點或終端節點 度不為0的結點稱為...

資料結構筆記 第六章

一.圖的儲存結構及實現 圖可以使用兩種儲存結構,分別是鄰接矩陣和鄰接表。鄰接矩陣以矩陣的形式儲存圖所有頂點間的關係。鄰接矩陣具有以下特點 1,鄰接矩陣是正矩陣,即橫縱維數相等。2,矩陣的每一行或一列代表乙個頂點,行與列的交點對應這兩個頂點的邊。3,矩陣的點代表邊的屬性,1代表有邊,0代表無邊,所以矩...

資料結構第六章小結

第六章主要學習圖,感覺有蠻多概念和演算法要去記住,可能會造成混淆 在學習過程中,感覺不是實打實的掌握,還得多看看書。思維導圖如下 個人小測中 1 使用鄰接矩陣a儲存無向網路,若i號頂點與j號頂點之間不存在邊,則a i j 值為多少 連通圖中 鄰接矩陣 連通為1,不連通為0,無向網路連通為權值,不連通...