數據元素是數據的基本單位,在計算機程序中一般將其做爲一個總體進行考慮和處理。一個數據元素可由若干個數據項組成。算法
數據項是數據結構中討論的最小單位,是數據記錄中最基本的,不可分的數據單位。編程
數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。數據結構包括3方面的內容:邏輯結構,存儲結構和對數據的運算segmentfault
數據的邏輯結構是對數據之間關係的描述,它與數據的存儲結構無關,同一種邏輯結構能夠有多種存儲結構。概括起來數據的邏輯結構主要有兩大類。數組
線性結構 簡單地說,線性結構是一個數據元素的有序(次序)集合。它有四個基本特徵:數據結構
數據據結構中線性結構指的是數據元素之間存在着「一對一」的線性關係的數據結構。如(a1,a2,a3,.....,an),a1爲第一個元素,an爲最後一個元素,此集合即爲一個線性結構的集合。編程語言
數據的物理結構又稱爲存儲結構,是數據的邏輯結構在計算機中的表示(又稱映像)。它包括數據元素的表示和關係的表示。當數據元素是由若干數據項構成的時候,數據項的表示稱爲數據域;好比一個鏈表結點,結點包含值域和指針域,這裏結點能夠看作一個數據元素,其中的值域和指針域都是這個數據元素的數據域。學習
數據元素之間的關係在計算機中有兩種不一樣的表示方法:順序映像和非順序映像。對應的兩種不一樣的存儲結構分別是順序存儲結構和鏈式存儲結構。順序映像是藉助數據元素在存儲器中的相對位置來表示數據元素之間的邏輯關係;非順序映像是藉助指針表示數據元素之間的邏輯關係。spa
編程世界中存在許多不一樣類型的數據結構。 其中,如下是最經常使用的:設計
一般,變量能夠存儲單個數據類型,單個標量數據類型只能存儲單個值。在許多狀況下,咱們可能須要將一些數據類型組合在一塊兒做爲單個複雜數據類型。例如,咱們但願將一些學生信息存儲在學生數據類型中。 咱們須要學生姓名,地址,電話號碼,電子郵件,出生日期,學生所在班級等。 爲了將每一個學生記錄存儲到一個獨特的學生數據類型,咱們須要一個特殊的結構。 這能夠經過結構體輕鬆實現。 換句話說,結構體是值的容器,一般使用名稱訪問。 結構體在C編程語言中很是流行,咱們也能夠在PHP中使用相似的概念。3d
雖然數組被認爲是PHP中的數據類型,但數組其實是一種被全部編程平臺都使用的數據結構。 在PHP中,數組其實是一個有序的映射(ordered map),咱們將在稍後瞭解映射(map)。咱們能夠將多個值做爲單個變量存儲在單個數組中。矩陣類型數據易於存儲在數組中,所以數組在全部編程平臺中獲得普遍使用。一般,數組是固定大小的集合,可經過順序數字索引訪問。在PHP中,數組的實現方式不一樣,您能夠定義動態數組,而無需定義任何固定大小的數組。數組能夠有不一樣的維度。 若是一個數組只有一個索引來訪問一個元素,咱們稱之爲單維數組。 可是若是須要兩個或更多索引來訪問元素,咱們分別稱它爲二維或多維數組。 如下是兩個數組數據結構圖:
鏈表是線性數據結構,它是數據元素的集合,也稱爲節點,能夠具備不一樣的大小。一般,列出的數據元素經過稱爲連接的指針連接,所以稱爲連接列表。在鏈表中,一個列表元素經過指針連接到下一個元素。從下圖中,咱們能夠看到鏈表實際上維護了一個有序集合。 鏈表是編程語言使用的最多見和最簡單的數據結構形式。 在單個鏈表中,咱們只能前進。
注意:指針存儲變量地址。
雙向鏈表是一種特殊類型的鏈表,不只存儲下一個節點的指針,還將前一個節點指針存儲在節點結構。所以,它能夠在列表中先後移動。 它經過同時包含前一個和下一個指針,提供比單鏈表更多的靈活性。下圖描述了一個雙向鏈表。
棧是一個具備後進先出(last in first out)原理的線性數據結構。所以,棧只在一端添加新元素或刪除元素。 它是計算機技術中最古老,最經常使用的數據結構之一。咱們老是使用名爲棧頂的單個點在棧中添加或刪除元素。 術語「入棧(push)」用於指示添加元素到棧頂,「出棧(pop)」是從棧頂頂刪除元素。下圖描述了棧。
隊列是遵循先進先出(first in first out)原理的另外一種線性數據結構。隊列容許對集合進行兩個基本操做。 第一個是入隊(enqueue),它容許咱們將一個元素添加到隊列的後面。 第二個是(出隊)dequeue,它容許咱們從隊列的前面刪除一個元素。 隊列是計算機技術中最經常使用的數據結構之一。下圖描述了隊列。
集合(Set)是一種抽象數據類型,用於存儲某些值。集合(Set)不像咱們從中檢索特定值的集合(Collection)那樣使用; 集合(Set)用於檢查其中是否存在值。這些值不以任何特定順序存儲,且集合中不該有任何重複值。能夠將集合數據結構進行排序,並將其稱爲有序集合(Ordered Set)。
映射是鍵值對的集合(Collection),其中全部鍵都是惟一的。咱們能夠將映射視爲一個全部鍵都是惟一的關聯數組。實際上,PHP數組是有序映射的實現。
樹是計算領域中使用最普遍的非線性數據結構。 它高度用於分層數據結構。樹由節點組成,而且有一個特殊節點,稱爲樹根,它是樹結構的開始。其餘節點派生於根節點。樹數據結構是遞歸的,這意味着樹能夠包含許多子樹。節點經過邊緣相互鏈接。下圖描述了樹。
圖數據結構是一種特殊類型的非線性數據結構,由有限數量的頂點或節點以及邊或弧組成。圖表既能夠是有向的,也能夠是無向的。 有向圖清楚地表示邊緣的方向,而無向圖提示邊緣而不是方向。 結果,在無向圖中,邊緣的兩個方向都被認爲是單個邊緣。 換句話說,咱們能夠說圖是一對集合(V,E),其中V是頂點集,E是邊集:
V = {A, B, C, D, E, F}
E = {AB, BC, CE, ED, EF, DB}
在有向圖中,邊AB不一樣於邊BA,而在無向圖中,AB和BA都相同。 圖數據結構能夠很方便地解決計算機領域中的許多複雜問題。下圖描述了圖數據結構。
堆是一種特殊的基於樹的數據結構,它知足堆屬性。最大的鍵是根,較小的鍵是葉子,稱爲最大堆。或者,最小的鍵是根,較大的鍵是葉子,稱爲最小堆。雖然堆結構的根是樹的最大或最小鍵,但它不必定是排序結構。 堆用於解決圖算法的效率和排序。下圖描述了最大堆。