《資料結構(c++版)》之第三章棧和佇列
一、棧的定義
棧是限定僅在表尾插入和刪除操作的線性表,允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何資料元素的棧我們將其稱之為空棧。
插入元素也稱進棧和壓棧,刪除元素也稱出棧和彈棧。棧中的資料元素之間不僅具有
線性關係,而且具有
後進先出的特性。
例如:首先按順序壓棧:a1,a2,a3;如果要刪除元素,其彈棧的順序是:a3,a2,a1;
棧中的元素具有相同型別以及後進先出的特性,相鄰元素之間有前驅和後繼的關係。
二、棧的順序儲存結構——順序棧
唯一需要確定的就是用陣列的哪一端作為棧底,其本質上是順序表的簡化。通常情況下,我們將
陣列中下標為0的一端作為棧底,同時,我們用指標top來指示棧頂
元素的位置,設儲存棧元素的陣列長度為stacksize。
空棧時:棧頂指標top=-1;
滿棧時:棧頂指標top=stacksize-1;
入棧時:棧頂指標top+1;
彈棧時:棧頂指標top-1;
順序棧的實現:棧元素的資料型別不確定,所以我們一般採用c++的模版機制。其時間複雜度為o(1)。
兩棧共享空間:如果需要同時使用兩個相同資料型別的棧是,直接做法就是為每個棧都開闢乙個儲存空間,但是這樣容易造成空間冗餘,例如乙個棧滿了不夠放
資料了,但是另外乙個棧還很空。所以,出於對這個的考慮,一般我們會採取這樣可取的方法:(單向延伸性)
使用乙個陣列來存放這兩個棧,讓棧一的棧底作為陣列的始端,棧二的棧底作為該陣列的末端,兩棧同時向陣列的中間延伸。
注意:兩棧共享空間以上的做法,只有空間需求具有相反關係時(即此消彼長時)安可奏效。
三、棧的鏈結儲存結構——鏈棧
通常鏈棧用
單鏈表表示,故鏈棧的結點結構和單鏈表的結點結構相同。用單鏈表的頭部做棧頂。
順序棧的實現:鏈棧的結點結構可以復用單鏈表的結點結構。其時間複雜度為o(1).鏈棧沒有頭結點,所以要將棧頂指標設為空。
四、佇列的定義
佇列是只允許在一端進行插入操作,在另一端進行刪除操作的線性表。允許插入(入隊、進隊)的一端稱為
隊尾,允許刪除(出隊)的另一端稱為隊頭。
佇列中的元素之間不僅具有線性關係,而且具有先進先出的特性。
例如:按順序入隊:a1,a2,a3;;如果要刪除元素,其出隊的順序是:a1,a2,a3;
佇列中的元素具有相同型別及先進先出特性,相鄰元素具有前驅和後繼的關係。
五、佇列的順序儲存結構——迴圈佇列
佇列是特殊的線性表。 允許佇列直接從陣列中下標最大的位置延續到下標最小的位置,這個通過取模操比較容易實現,這種頭尾相接的順序儲存結構稱為迴圈佇列。
隊空和隊滿的判定方法:可以用乙個陣列的元素空間來實現隊尾指標和隊頭指標相差1(類似於隊滿的臨界狀態),即隊滿的條件為:
(rear+1)%queuesize=front
迴圈佇列的實現:同樣的因為佇列元素的資料型別不是很確定,這個時候我們還是要採用c++模版機制。其時間複雜度為o(1)。
六、迴圈佇列的鏈結儲存——鏈佇列
為了使空佇列和非空佇列的操作一致,鏈佇列也加上頭結點。設定頭指標指向鏈佇列的頭結點,隊尾指標指向終端結點。
鏈佇列的實現;同樣的因為佇列元素的資料型別不是很確定,這個時候我們還是要採用c++模版機制。其時間複雜度為o(1)。
七、本章知識思維導圖
資料結構第三章棧和佇列
第四章 棧和佇列 1.棧 限定僅在表尾進行插入或刪除操作的線性表,表尾端稱為棧頂,表頭端稱為棧底。棧頂移動,棧底固定。特點 先進後出 後進先出 typedef struct sqstack status push sqstack s,selemtype e status pop sqstack s,...
資料結構 第三章 棧和佇列
目錄 3.1 堆疊的基本概念 3.2 堆疊的順序儲存結構 一 構造原理 二 實現 三.多棧共享連續空間問題 3.3 堆疊的鏈式儲存結構 一.構造原理 二 實現 3.4 佇列的基本概念 3.5佇列的順序儲存結構 一.構造原理 二 實現 三.迴圈佇列 3.5 佇列的鏈式儲存結構 一.構造原理 二 實現 ...
資料結構 第三章 棧和佇列
3.1特殊的線性表 棧 3.2特殊的線性表 佇列 3.1特殊的線性表 棧 3.1.1棧的邏輯結構 棧 限定僅在表尾進行插入和刪除操作的線性表。空棧 不含任何資料元素的棧。允許插入和刪除的一端稱為棧頂,另一端稱為棧底。棧的操作特性 後進先出。3.1.2棧的順序儲存結構及實現 順序棧類 順序棧類的宣告 ...