1. 程式人生 > >《大話數據結構》讀書筆記(1)

《大話數據結構》讀書筆記(1)

算法 會有 來看 節點 套路 引用 實現 獲取 存儲結構

其實去年的時候就看過這本書了。只是,基本上是走馬觀花, 了解了一些基本概念。這次,為了看懂裏面的代碼,又特地去復習了一下c語言。還記得上次看的時候,感覺算法果然名不虛傳,真的難!現在看來,其實這本書寫的非常簡單。至少,從我目前的視角來看,還是略掉了很多東西的。比如,前面的線性表部分講的非常的詳細,後面到了串、樹、圖就只提及了一些重要的部分。也許,大多數人也只會看前幾章吧,畢竟算法還是很枯燥的。

首先,說到數據結構,就不得不提起抽象的數據類型這個概念。有人說,程序=數據結構+算法。或者,更加形象的說,程序就是用一堆變量不斷加加減減,最後得出結果。那麽,這與抽象的數據類型又有什麽關系呢?其實,我們都知道,每一門編程語言都有一些基本數據類型,用這些數據類型足以滿足我們的編程需求。然而,我們卻時常會創建一些自己的數據類型(類)。可能,很多人只是遵循語言特性,並沒有考慮原因。事實上,使用抽象的數據類型是為了遵循關註點分離的原則。抽象的數據類型通常會封裝很多對於基本數據的操作,它使得我們可以專註於業務邏輯,而不是過多的去關註很多細節的東西。也就是說,我們使用抽象的數據類型,即學習數據結構,是為了學習一種思想,一種抽象和簡化的思想。

這一篇就來說說我對於線性表的理解吧。線性表,顧名思義,就是直線式的數據結構。每個表中的元素都會有一個前驅元素或者後繼元素,元素與元素之間是一一對應的關系。

  1、線性表的抽象數據類型

    線性表作為一種抽象的數據類型,主要操作有是否為空、清空、查找元素、插入、刪除、獲取長度。

  2、線性表的存儲結構

    順序存儲、鏈式存儲。順序存儲是指將線性表的數據存儲到數組中,然後以這個數組為操作的對象來實現線性表的操作。而鏈式存儲則是以鏈表的形式來存儲數據。鏈表是指一些分散的數據塊,不同於數組,不需要在內存上的固定位置。鏈表的每個數據塊,稱為一個節點。每個節點又由兩部分組成,一個是數據域,一個是指針域。數據域自是不必多說,指針域則存放著下一個節點的地址。順序存儲的主要缺點是大小是固定的,鏈式存儲則不受限制。所以,很多實現基本上是用的鏈式存儲。

  3、線性表的示例

    單鏈表、靜態鏈表、循環鏈表、雙向鏈表。靜態鏈表是因為某些語言沒有指針或者引用類型的概念,所以應用一些特殊手段來實現指針的效果。單鏈表是與雙向鏈表相對的,單鏈表只有一個指向下一個元素的指針,而雙向鏈表有兩個指針,一個指向上一個元素,另一個指向下一個元素。循環鏈表,想想都知道,它的尾指針指向了頭節點,構成了一個循環。

    棧、隊列。棧,是一種後進先出的結構。可以想象一疊文件,不斷往上放,最上面總會先處理。隊列,就更加形象了。可以想象排隊買飯,排在前面的先買到,後來的只能插到隊尾(理論上是這樣,但還是有很多人不按套路來)。棧和隊列都是一種特殊的線性表,只是在插入和刪除上略有不同。

《大話數據結構》讀書筆記(1)