整體把握
陣列、鍊錶、樹等等都適用於資料庫應用中作資料記錄,常用來記錄對應於現實世界的資料;而棧、佇列及優先順序佇列更多地是作為程式設計師的工具來使用(用最合適的工具幹活),以簡化某些程式操作。
棧、佇列及優先順序佇列都可以使用陣列鍊錶來實現,優先順序佇列通常使用堆實現。
在棧、佇列及優先順序佇列中,訪問是受限制的,在某一時刻只有某乙個特定的資料項可以被讀取或刪除。
棧
應用:單詞逆序;
解析源**時檢驗括號匹配;解析算術表示式;棧操作還嵌入在微處理器中,比如當呼叫乙個方法時返回值和引數壓入棧,方法結束時,那些資料出棧。
解析算術表示式:
算術表示式求值通常都是先轉換為字尾表示式,再求字尾表示式的值;在中綴表表示式轉換為字尾表示式以及求字尾表示式的值的過程裡,棧都是很有用的工具。
中綴表表示式
字尾表示式
((a+b)*c)-d
ab+c*d-
a+b*(c-d/(e+f))
abcdef+/-*+
轉換字尾表示式規則:運算元不入棧,操作符入棧,在適當的時候出棧,比如中綴表示式1+2*3-5=,解析為字尾表示式過程如下表所示
步數讀表示式
var棧
備註第一步11
第二步1+1+
第三步1+212+
第四步1+2*
12+*
第五步1+2*3
123+*
第六步1+2*3-
123*+
-讀到-時把*出棧,把+也出棧
第七步1+2*3-5
123*+5
-第八步
1+2*3-5=
123*+5-
讀到=時把-出棧
字尾表示式求值規則:運算元入棧、遇到操作符從棧中提出兩個運算元執行計算,結果入棧,計算123*+5-的值如下表所示
步數讀表示式
棧 第一步11
第二步12
12第三步
123123
第四步123*
16第五步
123*+
7第六步
123*+5
75第七步
123*+5-2實現
陣列實現,棧內有乙個top記錄棧頂的資料頂,插入++top,刪除top--
單鏈表實現,push()對應insertfisrt(),pop()對應deletefirst()
效率入棧出棧o(1),也就是說,所耗的時間不依賴於棧中資料項的個數,棧不需要比較和移動操作。
**
packageview codemytest;
public
class
stack
public
void push(int
element)
public
intpop()
public
intpeek()
public
boolean
isempty()
public
boolean
isfull()
}class
mytest
if (!stack.isempty())
else
}}class
wordreverser
private
static
string wordreverser(string str)
str = "";
while (!stack.isempty())
return
str;
}}class
compiler e"; //
correct
private
static string src3 = "ae"; //
not correct; doesn't match
private
static string src4 = "a[bd]e}"; //
not correct; nothing matches final }
private
static string src5 = "a
public
static
void
compile(string src) ':
case ']':
case ')':
if(stack.isempty())
else
' || pop == '[' && c == ']' || pop == '(' && c == ')')) }}
}if(stack.isempty())
else}}
佇列
應用:網際網路資料報等待傳送;作業系統裡有很多佇列,列印作業的列印佇列;文字處理軟體有乙個容納鍵入內容的佇列,佇列保證了鍵入內容的順序不會改變。
佇列也可以用於模擬真實世界,比如模擬銀行排隊、飛機等待起飛。
實現:陣列實現,通常的作法是通過移動隊頭隊尾的指標保持資料項的位置不變,這樣必須使用環繞式處理。
雙端鍊錶實現,insert()對應insertlast(),remove對應deletefirst()
效率:插入刪除資料項的時間複雜度都是o(1)
雙端佇列
頭尾都可以插入和刪除,比如可能有方法insertleft()/insertright、removeleft()/removeright()
優先順序佇列
優先順序佇列其實就是有序佇列,有公升序優先順序佇列和降序優先順序佇列;它允許訪問最小(最大)的資料項。
應用:在搶先式多工作業系統中,程式排列在優先順序佇列中,這樣優先順序最高的程式就會先得到時間片執行。
很多情況下需要訪問具有最小關鍵字值的資料項,比如尋找最便宜的方法或最短的路徑去做某件事。
實現:除了可以快速訪問最小關鍵字值的資料項,優先順序佇列還應該實現相當快的插入資料項,因此優先順序佇列通常使用椎來實現。
陣列實現1——>有序陣列實現,不需要使用環繞指標,插入慢,刪除快
陣列實現2——>無序陣列實現,插入快,刪除慢,因為要尋找最小值
有序鍊錶實現
佇列 優先順序佇列
優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...
優先順序佇列
分為最小優先順序佇列和最大優先順序佇列。優先順序佇列是一種用來維護一組元素構成的集合s的資料結構,這一組元素都有乙個關鍵字key,乙個最大優先順序佇列支援的操作 insert s,x 把x插入到集合s中 maxmum s 返回s中最大元素 extra max s 去掉s中最大關鍵字並返回該最大關鍵子...
優先順序佇列
1 include stdafx.h 2 include3 4 using namespace std 5 6 define max heap len 107 int heap max heap len 8 int heap size 0 the number of elements in heap...