一、線性表的定義
零個或多個數據元素的 “有限”“序列” 。
二、線性表的相關概念
- 線性表長度: 線性表元素的個數(n≥0),當n=0時,稱爲空表;
- 前驅元素: 相對於表內的某元素,位於其位置前面的元素;
- 後驅元素: 相對於表內的某元素,位於其位置後面的元素;
- 直接前驅元素: 相對於表內的某元素,相鄰於其位置前面的元素;
- 直接後驅元素: 相對於表內的某元素,相鄰於其位置後面的元素。
三、線性表的存儲結構
- 順序存儲結構: 用一段地址連續的存儲單元依次存儲線性表的數據元素;
- 鏈式存儲結構: 將數據與後繼數據的存儲地址以結點形式合併,用不連續的存儲單元存儲線性表。
四、鏈式存儲結構的相關概念
- 鏈式頭指針: 指向鏈表第一個結點(頭結點)的指針,無論鏈表是否爲空,頭指針必須存在且不爲空。由於具有標識作用,所以一般將頭指針冠以鏈表的名字;
鏈式頭結點: 數據域無意義,指針域指向第一元素地址。爲了統一第一節點的插入、刪除操作而設立,不是鏈表的必須要素。 - 單鏈表: 最常規形式的鏈表,其頭結點數據域存儲鏈表長度或無意義,終端結點指針端數據爲空指針;
- 靜態鏈表: 用數組形式描述的鏈表。以數組下標,替代單鏈表中的後續結點地址。相鄰結點的位置與存儲地址無關,在插入和刪除結點時,不需要像順序存儲結構那樣,移動大量元素,只修改數組下標(“遊標”)即可。但在初始化定義時,需要估算鏈表的最大可能長度,以開闢數組空間;
- 循環鏈表: 將單鏈表中終端結點的指針端,由空指針改爲指向頭結點,使整個單鏈表形成一個環,這種頭尾相接的單鏈表稱爲單循環鏈表,簡稱循環鏈表;
- 雙向鏈表: 在單鏈表的每個結點中,再設置一個指向其前驅結點的指針域。故雙向鏈表中的結點都有兩個指針域,一個指向直接後繼,另一個指向直接前驅,實現雙向的結點搜尋。
五、特殊線性表
1. 棧
1.1 棧的定義
棧是限定僅在表尾進行插入和刪除操作的線性表,又稱後進先出(Last In First Out)的線性表,簡稱LIFO結構。
1.2 棧的相關概念
- 空棧: 不含任何數據元素的棧;
- 棧頂(top): 棧中允許插入和刪除的一端;
- 棧底(bottom): 與棧頂相對的,位於棧另一頭的數據端;
- 進棧(push): 棧的插入操作,也稱壓棧、入棧;
- 出棧(pop): 棧的刪除操作,也稱彈棧。
1.3 特殊形式棧以及對應狀態
1.3.1 共享空間棧
將一段長度爲n的數組空間的兩端——0、n-1,分別作爲兩個棧(記爲棧1、棧2)的棧底。兩個棧共享數組空間,增加元素時,對應棧頂向中間延伸。
- 空棧:
棧1棧頂指針值等於-1,棧2棧頂指針值等於n。 - 滿棧:
① 棧1爲空棧時,棧2棧頂指針值等於0;
② 棧2爲空棧時,棧1棧頂指針值等於n-1;
③ 棧1、棧2不爲空時,兩者棧頂指針值相差1。
1.3.2 鏈棧
以頭結點爲棧頂,按鏈式存儲結構實現的棧。
注意: 鏈棧頭結點數據段爲有意義數據,區別於鏈表。
- 空棧:
頭指針(注意:不是頭結點指針)指向空。 - 滿棧:
除非計算機沒有任何可以使用的空間,瀕臨崩潰,否則理論上鍊式存儲結構不存在滿棧的情況。
2. 隊列
2.1 隊列的定義
隊列是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表,又稱先進先出(First In First Out)的線性表,簡稱FIFO結構。
2.2 隊列的相關概念
- 空隊列: 不含任何數據元素的隊列;
- 隊頭: 隊列中允許刪除的一端;
- 隊尾: 隊列中允許插入的一端。
- 入隊: 隊列的插入操作;
- 出隊: 隊列的刪除操作。
2.3 特殊形式隊列以及對應狀態
2.3.1 循環隊列
分別使用兩個指針,表示隊頭元素、隊尾的下一個元素的位置。插入時,若尾部指針,越過了可利用內存的邊界,先回到空間頭部,再將數據入隊。構成頭尾相接的特殊順序存儲結構。
注意: 由於尾部指針指向的是隊尾元素的下一個位置,這使得循環隊列滿時,頭部指針與尾部指針重合,與空隊列時的特徵一致。爲了區分兩種狀態,採用以下方法:
① 設置一個標誌變量flag,表示隊列狀態。當flag爲0時,表示隊列無數據,此時頭、尾部指針重合則認爲隊列空。反之,認爲隊列滿;
② 修改隊列滿的條件——保留一個元素空間,即當隊列滿時,數組中還有一個空閒單元。此時若頭部、尾部指針值差值的絕對值爲1,認爲隊列滿。(常用)
2.3.2 鏈隊列
隊列的鏈式存儲結構,本質上是一個尾進頭出的線性單鏈表。鏈隊列的頭部指針指向頭結點,尾部指針指向終端結點。
注意: 鏈隊列頭結點數據段爲有意義數據,區別於鏈表。