3.1 棧
3.1.1棧的邏輯結構
1. 棧:限定僅在表的一端進行插入和刪除操作的線性表。
允許插入和刪除的一端稱為棧頂,另一端稱為棧底。
空棧:不含任何資料元素的棧。
棧的操作特性:後進先出
注意:棧只是對錶插入和刪除操作的位置進行了限制,並沒有限定插入和刪除操作進行的時間。
2.棧的抽象資料型別定義
adt stack
data
棧中元素具有相同型別及後進先出特性,
相鄰元素具有前驅和後繼關係
operation
initstack
前置條件:棧不存在
輸入:無
功能:棧的初始化
輸出:無
後置條件:構造乙個空棧
destroystack
前置條件:棧已存在
輸入:無
功能:銷毀棧
輸出:無
後置條件:釋放棧所占用的儲存空間
push
前置條件:棧已存在
輸入:元素值x
功能:在棧頂插入乙個元素x
輸出:如果插入不成功,丟擲異常
後置條件:如果插入成功,棧頂增加了乙個元素
pop
前置條件:棧已存在
輸入:無
功能:刪除棧頂元素
輸出:如果刪除成功,返回被刪元素值,否則,丟擲異常
後置條件:如果刪除成功,棧減少了乙個元素
gettop
前置條件:棧已存在
輸入:無
功能:讀取當前的棧頂元素
輸出:若棧不空,返回當前的棧頂元素值
後置條件:棧不變
empty
前置條件:棧已存在
輸入:無
功能:判斷棧是否為空
輸出:如果棧為空,返回1,否則,返回0
後置條件:棧不變
endadt
3.1.2 棧的順序儲存結構及實現
1.棧的順序儲存結構——順序棧
(1)棧的初始化
(2)入棧操作
(3)出棧操作
(4)取棧頂元素
(5)判空操作
2.兩棧共享空間
初始化:
初始化運算是將棧頂初始化為
0兩棧共享空間:使用乙個陣列來儲存兩個棧,讓乙個棧的棧底為該陣列的始端,另乙個棧的棧底為該陣列的末端,兩個棧從各自的端點向中間延伸。
初始化:
初始化運算是將棧頂初始化為
0兩棧共享空間控制型別宣告
const int stack_size=100;
template
class bothstack
;3.1.3棧的鏈結儲存結構及實現
初始化:
初始化運算是將棧頂初始化為
01.鏈棧
鏈棧:棧的鏈結儲存結構、
初始化:
初始化運算是將棧頂初始化為
02.鏈棧的類宣告
template
class linkstack
3.1.4順序棧和鏈棧的比較
時間效能:相同,都是常數時間o(1)。
初始化:
初始化運算是將棧頂初始化為
空間效能:
順序棧:有元素個數的限制和空間浪費的問題。
鏈棧:沒有棧滿的問題,只有當記憶體沒有可用空間時才會出現棧滿,但是每個元素都需要乙個指標域,從而產生了結構性開銷
。初始化
:初始化運算是將棧頂初始化為
0總之,當棧的使用過程中元素個數變化較大時,用鏈棧是適宜的,反之,應該採用順序棧。
3.2 佇列
3.2.1佇列的邏輯結構
1.佇列的定義
初始化:
初始化運算是將棧頂初始化為
0佇列:只允許在一端進行插入操作,而另一端進行刪除操作的線性表。
允許插入(也稱入隊、進隊)的一端稱為隊尾,允許刪除(也稱出隊)的一端稱為隊頭。
空佇列:不含任何資料元素的佇列。
初始化:
初始化運算是將棧頂初始化為
0佇列的操作特性:先進先出。
初始化:
初始化運算是將棧頂初始化為
0佇列的抽象資料型別定義
初始化:
初始化運算是將棧頂初始化為
0adt queue
data
佇列中元素具有相同型別及先進先出特性,
相鄰元素具有前驅和後繼關係
operation
initqueue
前置條件:佇列不存在
輸入:無
功能:初始化佇列
輸出:無
後置條件:建立乙個空佇列
初始化:
初始化運算是將棧頂初始化為
0destroyqueue
前置條件:佇列已存在
輸入:無
功能:銷毀佇列
輸出:無
後置條件:釋放佇列所占用的儲存空間
enqueue
前置條件:佇列已存在
輸入:元素值x
功能:在隊尾插入乙個元素
輸出:如果插入不成功,丟擲異常
後置條件:如果插入成功,隊尾增加了乙個元素
初始化:
初始化運算是將棧頂初始化為
0dequeue
前置條件:佇列已存在
輸入:無
功能:刪除隊頭元素
輸出:如果刪除成功,返回被刪元素值
後置條件:如果刪除成功,隊頭減少了乙個元素
getqueue
前置條件:佇列已存在
輸入:無
功能:讀取隊頭元素
輸出:若佇列不空,返回隊頭元素
後置條件:佇列不變
初始化:
初始化運算是將棧頂初始化為
0empty
前置條件:佇列已存在
輸入:無
功能:判斷佇列是否為空
輸出:如果隊列為空,返回1,否則,返回0
後置條件:佇列不變
endadt
3.2.2
初始化:
初始化運算是將棧頂初始化為
0佇列的順序儲存結構及實現
初始化:
初始化運算是將棧頂初始化為
0迴圈佇列:將儲存佇列的陣列頭尾相接。
方法二:修改隊滿條件,浪費乙個元素空間,隊滿時陣列中只有乙個空閒單元;
方法三:設定標誌flag,當front=rear且flag=0時為隊空,當front=rear且flag=1時為隊滿。
(1)建構函式
(2) 入隊操作
(3)出隊操作
(4)讀取隊頭元素
(5)判空操作
3.2.3迴圈佇列和鏈佇列的比較
初始化:
初始化運算是將棧頂初始化為
0時間效能:
迴圈佇列和鏈佇列的基本操作都需要常數時間o (1)
初始化:
初始化運算是將棧頂初始化為
0空間效能:
迴圈佇列:必須預先確定乙個固定的長度,所以有儲存元素個數的限制和空間浪費的問題。
鏈佇列:沒有佇列滿的問題,只有當記憶體沒有可用空間時才會出現佇列滿,但是每個元素都需要乙個指標域,從而產生了結構性開銷。
初始化:
初始化運算是將棧頂初始化為
0
第三章 棧和佇列
棧和佇列 一 棧 1 棧的定義 棧是限定僅在表尾進行插入和刪除操作的線性表,允許插入和刪除的一端稱為棧頂,另一端稱為棧底,不含任何資料元素的棧稱為空棧。2 在任何時候出棧的元素都只能是棧頂元素,即最後最後入棧者最先出棧。所以棧中元素除了具有線性關係外,還具有後進先出的特性。3 棧的抽象資料型別定義 ...
第三章 棧和佇列
棧和佇列是兩種常用的資料結構,同時又是操作受限的線性表,也是兩種重要的抽象資料型別。1 1棧是限定僅在表尾進行插入和刪除操作的線性表。棧中元素具有線性關係和後進先出的特性。2雖然對插入和刪除操作的位置限制減少了棧的靈活性,但同時也使得棧的操作更有效更容易實現。3棧的儲存結構分兩種,一種是順序儲存結構...
第三章 棧和佇列
第三章棧和佇列 一 棧1.棧 限定僅在表尾進行插入和刪除操作的線性表 允許插入和刪除的一端稱為棧頂 另一端稱為棧底 2.空棧 不含任何資料元素的棧。3.在任何時候出棧的元素都只能是棧頂元素,即最後入棧者最先出棧,具有後進先出的特性。4.棧的抽象資料型別定義 1 push 輸入 元素值 x 輸出 如果...