1、數據結構有什么作用?
當使用 Java 里面的容器類時,你有沒有想過,怎么 ArrayList 就像一個無限擴充的數組,也好像鏈表之類的。很好使用,這就是數據結構的用處,只不過你在不知不覺中使用了。
數據結構內容比較多,細細的講解也是相對費功夫的,不可能達到一蹴而就。我就將常見的數據結構:堆棧、隊列、數組、鏈表和紅黑樹 給大家介紹一下,作為數據結構的入門,了解一下它們的特點即可。
2、常見的數據結構
數據存儲的常用結構有:棧、隊列、數組、鏈表和紅黑樹。
棧
-
棧:stack,又稱堆棧,它是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其他任何位置進行添加、查找、刪除等操作。
簡單的說:采用該結構的集合,對元素的存取有如下的特點:
-
先進后出(存進去的元素,要在后它后面的元素依次取出后,才能取出該元素)。
-
棧的入口、出口的都是棧的頂端位置。
需要注意的 2 個名詞
- 壓棧:就是存元素。即,把元素存儲到棧的頂端位置,棧中已有元素依次向棧底方向移動一個位置。
- 彈棧:就是取元素。即,把棧的頂端位置元素取出,棧中已有元素依次向棧頂方向移動一個位置。
隊列
-
隊列:queue,簡稱隊,它同堆棧一樣,也是一種運算受限的線性表,其限制是僅允許在表的一端進行插入,而在表的另一端進行刪除。
簡單的說,采用該結構的集合,對元素的存取有如下的特點:
-
先進先出(存進去的元素,要在后它前面的元素依次取出后,才能取出該元素)。
-
隊列的入口、出口各占一側。
棧和隊列的結構圖:

數組
-
數組:Array,是有序的元素序列,數組是在內存中開辟一段連續的空間,並在此空間存放元素。
簡單的說,采用該結構的集合,對元素的存取有如下的特點:
-
查找元素快:通過索引,可以快速訪問指定位置的元素
-
增刪元素慢
指定索引位置增加元素:需要創建一個新數組,將指定新元素存儲在指定索引位置,再把原數組元素根據索引,復制到新數組對應索引的位置。
指定索引位置刪除元素:需要創建一個新數組,把原數組元素根據索引,復制到新數組對應索引的位置,原數組中指定索引位置元素不復制到新數組中。
數組的結構示意圖:

鏈表
-
鏈表:linked list,由一系列結點node(鏈表中每一個元素稱為結點)組成,結點可以在運行時i動態生成。
每個結點包括兩個部分:
一個是存儲數據元素的數據域,
一個是存儲下一個結點地址的指針域。
鏈表結構有
單向鏈表與雙向鏈表。采用該結構的集合,對元素的存取有如下的特點:
- 多個結點之間,通過地址進行連接。
- 查找元素慢:想查找某個元素,需要通過連接的節點,依次向后查找指定元素。
- 增刪元素快:
- 增加元素:只需要修改連接下個元素的地址即可。
- 刪除元素:只需要修改連接下個元素的地址即可。
紅黑樹
-
二叉樹:binary tree ,是每個結點不超過2的有序樹(tree) 。
簡單的理解,就是一種類似於樹的結構,只不過每個結點上都最多只能有兩個子結點。
二叉樹是每個節點最多有兩個子樹的樹結構。頂上的叫根結點,兩邊被稱作“左子樹”和“右子樹”。
結構示意圖:

二叉樹的一種比較有意思的叫做紅黑樹,紅黑樹本身就是一顆二叉查找樹,將節點插入后,該樹仍然是一顆二叉查找樹。也就意味着,樹的鍵值仍然是有序的。
紅黑樹的約束:
節點可以是紅色的或者黑色的
根節點是黑色的
葉子節點(特指空節點)是黑色的
每個紅色節點的子節點都是黑色的
任何一個節點到其每一個葉子節點的所有路徑上黑色節點數相同
紅黑樹的特點:
速度特別快,趨近平衡樹,查找葉子元素最少和最多次數不多於二倍。
