Java之資料結構
一、棧
棧:stack,又稱堆疊,它是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其他任何位置進行新增、查詢、刪除等操作。
簡單的說:採用該結構的集合,對元素的存取有如下的特點:
(1)先進後出(即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素)。例如,子彈壓進彈夾,先壓進去的子彈在下面,後壓進去的子彈在上面,當開槍時,先彈出上面的子彈,然後才能彈出下面的子彈。
(2)棧的入口、出口的都是棧的頂端位置。
這裡兩個名詞需要注意:
1. 壓棧:就是存元素。即,把元素儲存到棧的頂端位置,棧中已有元素依次向棧底方向移動一個位置。
2. 彈棧:就是取元素。即,把棧的頂端位置元素取出,棧中已有元素依次向棧頂方向移動一個位置。
二、佇列
佇列:queue,簡稱隊,它同堆疊一樣,也是一種運算受限的線性表,其限制是僅允許在表的一端進行插入,而在表的另一端進行刪除。簡單的說,採用該結構的集合,對元素的存取有如下的特點:
(1)先進先出(即,存進去的元素,要在後它前面的元素依次取出後,才能取出該元素)。例如,小火車過山洞,車頭先進去,車尾後進去;車頭先出來,車尾後出來。
(2)佇列的入口、出口各佔一側。例如,下圖中的左側為入口,右側為出口。
三、陣列
陣列:Array,是有序的元素序列,陣列是在記憶體中開闢一段連續的空間,並在此空間存放元素。就像是一排出租屋,有100個房間,從001到100每個房間都有固定編號,通過編號就可以快速找到租房子的人。簡單的說,採用該結構的集合,對元素的存取有如下的特點:
(1)查詢元素快:通過索引,可以快速訪問指定位置的元素
(2)增刪元素慢:
1)指定索引位置增加元素:需要建立一個新陣列,將指定新元素儲存在指定索引位置,再把原陣列元素根據索引,複製到新陣列對應索引的位置。如下圖:
2)指定索引位置刪除元素:需要建立一個新陣列,把原陣列元素根據索引,複製到新陣列對應索引的位置,原陣列中指定索引位置元素不復制到新陣列中。如下圖:
四、連結串列
連結串列:linked list,由一系列結點node(連結串列中每一個元素稱為結點)組成,結點可以在執行時i動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。我們常說的連結串列結構有單向連結串列與雙向連結串列,那麼這裡給大家介紹的是單向連結串列。
簡單的說,採用該結構的集合,對元素的存取有如下的特點:
(1)多個結點之間,通過地址進行連線。例如,多個人手拉手,每個人使用自己的右手拉住下個人的左手,依次類推,這樣多個人就連在一起了。
(2)查詢元素慢:想查詢某個元素,需要通過連線的節點,依次向後查詢指定元素
(3)增刪元素快:
1)增加元素:只需要修改連線下個元素的地址即可。
2)刪除元素:只需要修改連線下個元素的地址即可。
五、紅黑樹
二叉樹:binary tree ,是每個結點不超過2的有序樹(tree) 。
簡單的理解,就是一種類似於我們生活中樹的結構,只不過每個結點上都最多隻能有兩個子結點。二叉樹是每個節點最多有兩個子樹的樹結構。頂上的叫根結點,兩邊被稱作“左子樹”和“右子樹”。
如圖:
我們要說的是二叉樹的一種比較有意思的叫做紅黑樹,紅黑樹本身就是一顆二叉查詢樹,將節點插入後,該樹仍然是一顆二叉查詢樹。也就意味著,樹的鍵值仍然是有序的。如圖所示: