棧 佇列及優先順序佇列

2022-06-09 15:30:08 字數 3123 閱讀 7499

整體把握

陣列、鍊錶、樹等等都適用於資料庫應用中作資料記錄,常用來記錄對應於現實世界的資料;而棧、佇列及優先順序佇列更多地是作為程式設計師的工具來使用(用最合適的工具幹活),以簡化某些程式操作。

棧、佇列及優先順序佇列都可以使用陣列鍊錶來實現,優先順序佇列通常使用堆實現。

在棧、佇列及優先順序佇列中,訪問是受限制的,在某一時刻只有某乙個特定的資料項可以被讀取或刪除。

應用:單詞逆序;

解析源**時檢驗括號匹配;解析算術表示式;棧操作還嵌入在微處理器中,比如當呼叫乙個方法時返回值和引數壓入棧,方法結束時,那些資料出棧。

解析算術表示式:

算術表示式求值通常都是先轉換為字尾表示式,再求字尾表示式的值;在中綴表表示式轉換為字尾表示式以及求字尾表示式的值的過程裡,棧都是很有用的工具。

中綴表表示式

字尾表示式

((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),也就是說,所耗的時間不依賴於棧中資料項的個數,棧不需要比較和移動操作。

**

package

mytest;

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}}

view code

佇列

應用:網際網路資料報等待傳送;作業系統裡有很多佇列,列印作業的列印佇列;文字處理軟體有乙個容納鍵入內容的佇列,佇列保證了鍵入內容的順序不會改變。

佇列也可以用於模擬真實世界,比如模擬銀行排隊、飛機等待起飛。

實現:陣列實現,通常的作法是通過移動隊頭隊尾的指標保持資料項的位置不變,這樣必須使用環繞式處理。

雙端鍊錶實現,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...