1. 程式人生 > >資料結構有哪些,常用資料結構詳解

資料結構有哪些,常用資料結構詳解

通過上節我們知道,資料結構是學習資料儲存方式的一門學科,那麼,資料儲存方式有哪幾種呢?本節將對資料結構的學習內容做一個簡要的總結。

資料結構大致包含以下幾種儲存結構:
下面對各種資料結構做詳細講解。

線性表

線性表結構儲存的資料往往是可以依次排列的,就像小朋友手拉手,每位學生的前面和後面都僅有一個小朋友和他拉手,具備這種“一對一”關係的資料就可以使用線性表來儲存。
手拉手的小朋友
例如,儲存類似 {1,3,5,7,9} 這樣的資料時,各元素依次排列,每個元素的前面和後邊有且僅有一個元素與之相鄰(除首元素和尾元素),因此可以使用線性表儲存。

線性表並不是一種具體的儲存結構,它包含順序儲存結構鏈式儲存結構,是順序表和連結串列的統稱。

順序表

順序表,簡單地理解,就是常用的陣列,只是換了個名字而已,例如使用順序表儲存 {1,3,5,7,9},如圖 1 所示:
順序表結構
圖 1 順序表結構

由於順序表結構的底層實現藉助的就是陣列,因此對於初學者來說,可以把順序表完全等價為陣列,但實則不是這樣。資料結構是研究資料儲存方式的一門學科,它囊括的都是各種儲存結構,而陣列只是各種程式語言中的基本資料型別,並不屬於資料結構的範疇。

連結串列

我們知道,使用順序表(底層實現靠陣列)時,需要提前申請一定大小的儲存空間,這塊儲存空間的實體地址是連續的,如圖 1 所示。

連結串列則完全不同,使用連結串列儲存資料時,是隨用隨申請,因此資料的儲存位置是相互分離的,換句話說,資料的儲存位置是隨機的。

為了給各個資料塊建立“依次排列”的關係,連結串列給各資料塊增設一個指標,每個資料塊的指標都指向下一個資料塊(最後一個數據塊的指標指向 NULL),就如同一個個小學生都伸手去拉住下一個小學生的手,這樣,看似毫無關係的資料塊就建立了“依次排列”的關係,也就形成了連結串列,如圖 2 所示:
連結串列結構

圖 2 連結串列結構

棧和佇列

棧和佇列隸屬於線性表,是特殊的線性表,因為它們對線性表中元素的進出做了明確的要求。

中的元素只能從線性表的一端進出(另一端封死),且要遵循“先入後出”的原則,即先進棧的元素後出棧。

棧結構示意圖
圖 3 棧結構示意圖
棧結構如圖 3 所示,像一個木桶,棧中含有 3 個元素,分別是 A、B 和 C,從在棧中的狀態可以看出 A 最先進的棧,然後 B 進棧,最後 C 進棧。根據“先進後出”的原則,3 個元素出棧的順序應該是:C 最先出棧,然後 B 出棧,最後才是 A 出棧。

佇列中的元素只能從線性表的一端進,從另一端出,且要遵循“先入先出”的特點,即先進佇列的元素也要先出佇列。

佇列結構示意圖
圖 4 佇列結構示意圖
  佇列結構如圖 4 所示,佇列中有 3 個元素,分別是 A、B 和 C,從在佇列中的狀態可以看出是 A 先進佇列,然後 B 進,最後 C 進。根據“先進先出”的原則,3 個元素出佇列的順序應該是 A 最先出佇列,然後 B 出,最後 C 出。

樹儲存結構

樹儲存結構適合儲存具有“一對多”關係的資料。
家庭族譜
圖 5 家庭族譜
如圖 5 所示,其中張平只有一個父親,但他卻有兩(多)個孩子,這就是“一對多”的關係,滿足這種關係的資料可以使用樹儲存結構。

圖儲存結構

圖儲存結構適合儲存具有“多對多”關係的資料。
圖儲存結構示意圖
圖 6 圖儲存結構示意圖
  如圖 6 所示,從 V1 可以到達 V2、V3、V4,同樣,從 V2、V3、V4 也可以到達 V1,這就是“多對多”的關係,滿足這種關係的資料可以使用圖儲存結構。

 本節只是對資料結構中包含的各種儲存結構做一個簡要的介紹,各儲存結構具體的實現會在後續文章中作詳解介紹。