View
33
Download
0
Category
Preview:
Citation preview
授課教師陳士杰授課教師陳士杰國立聯合大學國立聯合大學 資訊管理學系資訊管理學系
資料結構資料結構(Data Structures)(Data Structures) Course 5 Stack and QueueCourse 5 Stack and Queue
22國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
OutlinesOutlines
本章重點
Stack的定義應用製作與ADT
Queue的定義應用製作與ADT
如何利用Array與Linked list製作Stack與Queue
Infix(中序)運算式與Postfix (後序) Prefix (前序) 運算式間之相互
轉換
Postfix與Prefix的計算 (Evaluation)
Stack Permutation
33國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack (Stack (堆疊堆疊))
Def 具有LIFO (last in-first out)或FILO (first in-last out)
性質的有序串列
插入元素的動作稱為PushPush 刪除元素的動作稱為PopPop
PushPop的動作皆發生在同一端此端稱為TopTop
44國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
StackStack之之ADTADT
Data Object Spec
A setset
of data item
TopTop 指出目前頂端元素所在
SizeSize 表Stack的大小
Operation Spec
Create(S)rarrS
建立一個空的Stack S 傳回値為一個新的Stack S傳回給User使用
Push(S item)rarrS
將資料item插入到Stack S中並成為Top端元素
If Stack full 則無法執行
Pop(S)rarritem S
刪除Stack S的Top端元素
If Stack empty 則無法執行
55國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(S)rarritem
傳回Stack S之Top端元素値但不刪除
If Stack empty 則無法執行
IsFull(S)rarrBoolean
判斷S是否為full
若是 則傳回True 否則傳回False
IsEmpty(S)rarrBoolean
判斷S是否為empty
若是 則傳回True 否則傳回False
66國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例1 1
Pop(Push(S item)) = S
Top(Push(S item)) = item
IsEmpty(Create(S)) = True
Pop(Create(s)) = Error
(無法執行 ∵是空的Stack)
IsEmpty(Push(S i)) = False
77國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例 22
有一空的Stack實施下列動作後Stack的內容為何
Push (S a) Push(S b) Pop(S) Push(Sc) Push(S d) Pop(S)
Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
22國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
OutlinesOutlines
本章重點
Stack的定義應用製作與ADT
Queue的定義應用製作與ADT
如何利用Array與Linked list製作Stack與Queue
Infix(中序)運算式與Postfix (後序) Prefix (前序) 運算式間之相互
轉換
Postfix與Prefix的計算 (Evaluation)
Stack Permutation
33國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack (Stack (堆疊堆疊))
Def 具有LIFO (last in-first out)或FILO (first in-last out)
性質的有序串列
插入元素的動作稱為PushPush 刪除元素的動作稱為PopPop
PushPop的動作皆發生在同一端此端稱為TopTop
44國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
StackStack之之ADTADT
Data Object Spec
A setset
of data item
TopTop 指出目前頂端元素所在
SizeSize 表Stack的大小
Operation Spec
Create(S)rarrS
建立一個空的Stack S 傳回値為一個新的Stack S傳回給User使用
Push(S item)rarrS
將資料item插入到Stack S中並成為Top端元素
If Stack full 則無法執行
Pop(S)rarritem S
刪除Stack S的Top端元素
If Stack empty 則無法執行
55國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(S)rarritem
傳回Stack S之Top端元素値但不刪除
If Stack empty 則無法執行
IsFull(S)rarrBoolean
判斷S是否為full
若是 則傳回True 否則傳回False
IsEmpty(S)rarrBoolean
判斷S是否為empty
若是 則傳回True 否則傳回False
66國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例1 1
Pop(Push(S item)) = S
Top(Push(S item)) = item
IsEmpty(Create(S)) = True
Pop(Create(s)) = Error
(無法執行 ∵是空的Stack)
IsEmpty(Push(S i)) = False
77國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例 22
有一空的Stack實施下列動作後Stack的內容為何
Push (S a) Push(S b) Pop(S) Push(Sc) Push(S d) Pop(S)
Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
33國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack (Stack (堆疊堆疊))
Def 具有LIFO (last in-first out)或FILO (first in-last out)
性質的有序串列
插入元素的動作稱為PushPush 刪除元素的動作稱為PopPop
PushPop的動作皆發生在同一端此端稱為TopTop
44國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
StackStack之之ADTADT
Data Object Spec
A setset
of data item
TopTop 指出目前頂端元素所在
SizeSize 表Stack的大小
Operation Spec
Create(S)rarrS
建立一個空的Stack S 傳回値為一個新的Stack S傳回給User使用
Push(S item)rarrS
將資料item插入到Stack S中並成為Top端元素
If Stack full 則無法執行
Pop(S)rarritem S
刪除Stack S的Top端元素
If Stack empty 則無法執行
55國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(S)rarritem
傳回Stack S之Top端元素値但不刪除
If Stack empty 則無法執行
IsFull(S)rarrBoolean
判斷S是否為full
若是 則傳回True 否則傳回False
IsEmpty(S)rarrBoolean
判斷S是否為empty
若是 則傳回True 否則傳回False
66國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例1 1
Pop(Push(S item)) = S
Top(Push(S item)) = item
IsEmpty(Create(S)) = True
Pop(Create(s)) = Error
(無法執行 ∵是空的Stack)
IsEmpty(Push(S i)) = False
77國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例 22
有一空的Stack實施下列動作後Stack的內容為何
Push (S a) Push(S b) Pop(S) Push(Sc) Push(S d) Pop(S)
Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
44國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
StackStack之之ADTADT
Data Object Spec
A setset
of data item
TopTop 指出目前頂端元素所在
SizeSize 表Stack的大小
Operation Spec
Create(S)rarrS
建立一個空的Stack S 傳回値為一個新的Stack S傳回給User使用
Push(S item)rarrS
將資料item插入到Stack S中並成為Top端元素
If Stack full 則無法執行
Pop(S)rarritem S
刪除Stack S的Top端元素
If Stack empty 則無法執行
55國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(S)rarritem
傳回Stack S之Top端元素値但不刪除
If Stack empty 則無法執行
IsFull(S)rarrBoolean
判斷S是否為full
若是 則傳回True 否則傳回False
IsEmpty(S)rarrBoolean
判斷S是否為empty
若是 則傳回True 否則傳回False
66國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例1 1
Pop(Push(S item)) = S
Top(Push(S item)) = item
IsEmpty(Create(S)) = True
Pop(Create(s)) = Error
(無法執行 ∵是空的Stack)
IsEmpty(Push(S i)) = False
77國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例 22
有一空的Stack實施下列動作後Stack的內容為何
Push (S a) Push(S b) Pop(S) Push(Sc) Push(S d) Pop(S)
Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
55國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(S)rarritem
傳回Stack S之Top端元素値但不刪除
If Stack empty 則無法執行
IsFull(S)rarrBoolean
判斷S是否為full
若是 則傳回True 否則傳回False
IsEmpty(S)rarrBoolean
判斷S是否為empty
若是 則傳回True 否則傳回False
66國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例1 1
Pop(Push(S item)) = S
Top(Push(S item)) = item
IsEmpty(Create(S)) = True
Pop(Create(s)) = Error
(無法執行 ∵是空的Stack)
IsEmpty(Push(S i)) = False
77國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例 22
有一空的Stack實施下列動作後Stack的內容為何
Push (S a) Push(S b) Pop(S) Push(Sc) Push(S d) Pop(S)
Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
66國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例1 1
Pop(Push(S item)) = S
Top(Push(S item)) = item
IsEmpty(Create(S)) = True
Pop(Create(s)) = Error
(無法執行 ∵是空的Stack)
IsEmpty(Push(S i)) = False
77國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例 22
有一空的Stack實施下列動作後Stack的內容為何
Push (S a) Push(S b) Pop(S) Push(Sc) Push(S d) Pop(S)
Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
77國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
練習範例練習範例 22
有一空的Stack實施下列動作後Stack的內容為何
Push (S a) Push(S b) Pop(S) Push(Sc) Push(S d) Pop(S)
Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
88國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack Stack 的排列組合問題的排列組合問題(Stack Permutation)(Stack Permutation)
三個資料a b c依序push入stack而過程中可插入pop動 作則合法的排列組合有哪些
Sol
abc push a pop push b pop push c pop
acb push a pop push b push c pop pop
bac push a push b pop pop push c pop
bca push a push b pop push c pop pop
cab push a push b push c pop
cba push a push b push c pop pop pop
there4共有5種合法的排列組合
( )
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
99國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
n個資料執行stack permutation其合法的排列組合個數 為多少
Sol
Catalmnn
Number可用於表示
n個nodes所形成的不同二元樹個數
n個 ldquo(rdquo
與 ldquo)rdquo
所形成的合法配對個數
n個矩陣之所有可能相乘方式 ((同同 ldquoldquo括號配對括號配對rdquordquo的觀念的觀念))
⎟⎟⎠
⎞⎜⎜⎝
⎛+ n
nn
21
1 CatalmnnCatalmnn NumberNumber
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1010國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
有兩個方式
用Linked List
用Array
當然我們也可以用Stack實作出Queue或用Queue實作出
Stack但這是另一層次的問題了
StackStack之製作之製作
ADTStackStack QueueQueue TreeTree GraphGraph
怎麼實作怎麼實作 Array Linked List
較基礎的DS(層次較低)
應用於應用於
Application Program
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1111國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked ListLinked List製作製作StackStack要利用 linked list 實作 stack需要撰寫兩個不同的結構
(Structure)
HeadHead用以當作堆疊中的Top以指出堆疊中頂端元素之所在
此Head結構內不一定要有存放資料之資料變數但一定要有一個指標一定要有一個指標以指
向堆疊的頂端元素
往後各節若無特別説明此Head結構皆僅有一個指標 名為ldquoToprdquo
Data NodeData Node用以存放欲置於堆疊中的資料
此節點的結構內至少要有至少要有一個指標一個指標與與一個資料變數一個資料變數指標用以指向下一個元
素資料變數用以存放堆疊的資料
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1212國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(SCreate(S))
主要作法主要作法 宣告top指標為null即可
top = nulltop = null
(初値)
top nullS
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1313國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
null
top
pNew
11
itemtop22
nulltop
pNew
11
itemtop22
推入非空堆疊推入非空堆疊 推入空堆疊推入空堆疊
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1414國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
New(t) 跟系統要求記憶體空間以產生並置放一個新節點pNew
pNew data = item 把資料 ldquoitemrdquo 塞到這個新節點pNew的Data欄位中
pNew link = top 11
top = pNew 22
end
特點
只要Memory有空間OS就允許Linked Stack去Push新資料不用
像Array一樣要先檢查Array是否滿了
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1515國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
null
dltPtr11
itemtop22讀出資料讀出資料
item
top
44Ret(dltPtrRet(dltPtr))
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1616國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
主要作法主要作法
begin
if (top = null)
Stack empty
else begin
11 dltPtr= top
22 item = toprarrdata
33 top = dltPtrrarrlink
44 Ret(dltPtr)
end
end
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1717國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
主要作法主要作法
begin
if (top= null)
success = false
else begin
print(toprarrdata)
success = true
end
return success
end
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1818國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
主要作法主要作法 begin
if (memory available)
result = false
else
result = true
return result
end
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
1919國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
主要作法主要作法 begin
if (top=null)
result = false
else
result = true
return result
end
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2020國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作StackStack
我們專注於以下的Operation Spec
Create(S)Create(S)rarrS
Push(SPush(S item)item)rarrS
Pop(S)Pop(S)rarritem S
Top(S)Top(S)rarritem
IsFull(S)IsFull(S)rarrBoolean
IsEmpty(S)IsEmpty(S)rarrBoolean
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2121國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
建立空的Stack
只需做宣告即可
S Array[1hellipn] item 宣告一個Array
int
top = 0 設定一整數變數top且初値為0
為了説明方便以下談論用Array製作Stack時均假設一維陣列的
起始位址是從 1 開始這與實際撰寫C++有所出入請特別注意
Create(SCreate(S))
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2222國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Push(SPush(S item) item)
begin
if top = n
stack Full
else begin
top = top
+ 1
top要先加1
S[top] = item
再將item置入
end
endy
x
top
topitemS
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2323國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Pop(SPop(S))
begin
if top = 0
stack empty
else begin
item = S[top]
先將item叫出
top = top
-
1
再將top減1
end
endy
x
top
topitemS
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2424國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Top(STop(S))
begin
if top = 0
stack empty
else
return S[top] 將item叫出
end
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2525國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsEmpty(SIsEmpty(S))
begin
if top = 0
return True
else
return False
end
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2626國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
IsFull(SIsFull(S))
begin
if top = n
return True
else
return False
end
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2727國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Stack ApplicationStack Application
Procedure CallRecursive Call之處理
Parsing (剖析)
Reversing Data (反轉資料)
中序式 (Infix)與前序式 (Prefix)後序式 (Postfix)間互轉
後序式的計算
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2828國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Procedure CallRecursive Call (Procedure CallRecursive Call (副程式副程式遞迴呼叫遞迴呼叫))
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
2929國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Parsing (Parsing (剖析剖析))
編譯器 (Compiler)將程式剖析成單獨的個體如關鍵 字名字標誌hellip等以進行程式語法檢査
一般常見的程式問題是不對稱的括號 (Unmatched Unmatched
ParenthesesParentheses
)即是編譯器在剖析過程中藉由堆疊來做判斷
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3030國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Reversing Data (Reversing Data (反轉資料反轉資料))
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3131國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix與與PrefixPostfixPrefixPostfix間互轉間互轉
數學運算的表示式可有下列三種
Prefix (前序式) +ab
Infix (中序式) a+b
Postfix (後序式) ab+
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3232國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Infix (中序式)
Def 一般所使用的Expression Format
格式
Operand 1 (Operand 1 (運算元運算元 1)1)
Operator (Operator (運算子運算子))
Operand 2 (Operand 2 (運算元運算元 2)2)
運算子的種類
Binary + - divide times and or hellip
Unary not
缺點 不利於Compiler對式子運算的處理
∵需要考慮運算子之間的優先權優先權結合性結合性
there4Compiler可能需要來回多次scan才可以求算出結果
Ex a + b c uarr
(d -
e)
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3333國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
結合性對uarr - divide有影響
左結合 (5-3)-2 = 0
右結合 5-(3-2) = 4
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3434國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix (後序式)
格式
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2) 2) Operator(Operator(運算子運算子))
優點
Compiler易於處理scanscan一次一次即可求得計算結果
∵在後序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
中序式轉後序式需要用到一個一個StackStack的支援
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3535國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix (前序式)
格式
Operator(Operator(運算子運算子))
Operand 1(Operand 1(運算元運算元 1)1)
Operand 2(Operand 2(運算元運算元 2)2)
優點
Compiler處理Prefix的計算scanscan一次一次即可求得結果
∵在前序式的表示式當中已免除掉括號括號優先權優先權與結合性結合性的考量
但是在中序式轉前序式比較麻煩需要用到二個二個StackStack的支援there4還是傾向
使用Postfix
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3636國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式轉後序式前序式之相關議題
中序式與後序式前序式互轉的計算計算 (Evaluation)(Evaluation)
中序式轉後序式前序式
後序式前序式轉中序式
中序式與後序式前序式互轉的演算法演算法 (Algorithm)(Algorithm)
中序式轉後序式的演算法
後序式計算的演算法
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3737國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的計算前序式互轉的計算
中序式轉後序式前序式
後序式前序式轉中序式
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3838國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
使用 ldquo括號法括號法rdquo
中中 後後的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的右右括號
刪除左左括號予以輸出即可
中中 前前的歩驟
對於中序式先加上完整的括號配對完整的括號配對
將運算子取代最近的左左括號
刪除右右括號予以輸出即可
中序式轉後序式前序式中序式轉後序式前序式
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
3939國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
一般常見的運算子之優先權與結合性
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4040國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+BtimesC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的右右括號
((A+((BtimesC))) ) ((A ((BCtimes+
刪除左左括號 ((A ((BCtimes+ ABCABCtimestimes++
中中 前前
加上完整的括號配對完整的括號配對 ((timestimes優先於優先於++))
((A+((BtimesC))))
將運算子取代最近的左左括號
((A+((BtimesC))) ) +AtimesBC))) )
刪除右右括號 +AtimesBC))) ) +A+AtimestimesBCBC
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4141國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex A+B+C寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的右右括號
((((A+B))+C)) ((((AB+C+
刪除左左括號 ((((AB+C+ ABAB++CC++
中中 前前
加上完整的括號配對完整的括號配對 ((左結合左結合))
((((A+B))+C))
將運算子取代最近的左左括號
((((A+B))+C)) ++ABC))) )
刪除右右括號 ++ABC))) ) ++++ABCABC
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4242國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Ex AuarrBuarrC寫出其postfix及prefix
中中 後後
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的右右括號
((Auarr((BuarrC))) ) ((A((BCuarruarr
刪除左左括號 ((A((BCuarruarr ABCABCuarruarruarruarr
中中 前前
加上完整的括號配對完整的括號配對 ((右結合右結合))
((Auarr((BuarrC))))
將運算子取代最近的左左括號
((Auarr((BuarrC))) ) uarrAuarrBC))) )
刪除右右括號 uarrAuarrBC))) ) uarruarrAAuarruarrBCBC
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4343國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Infix轉Postfix
(A+BtimesC)-Cdivide(DdivideE)
(Ans A B C times
+ C D E divide divide -)
~A and B or (C gt E) and ~F (ldquo~rdquo表not)
(Ans A ~ B and C E gt or F ~ and)
Infix轉Prefix
A uarr
-B + C divide
(D -
E)
(Ans + uarr
A -
B divide
C -
D E)
-B + A uarr
2 -
4 times
B -
D divide
E uarr
F
(Ans --+-B uarr
A2 times4B divideD uarrEF)
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4444國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
後序式前序式轉中序式後序式前序式轉中序式
Prefix Infix
運算子運算子
運算元運算元 11
運算元運算元 2 2 運算元運算元 1 1 運算子運算子 運算元運算元 2 2
Postfix Infix
運算元運算元 11
運算元運算元 2 2 運算子運算子 運算元運算元 1 1 運算子運算子 運算元運算元 22
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4545國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB+DtimesEFADtimes+divide+C+則其infix為何
Sol
A B + D times
E F A D times
+ divide
+ C +
rArr
rArr ( A + B ) times
D + E divide
( F + A times
D ) + CHint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A+B) (AtimesD)( timesD) (F+ )(E divide
)( + )( +C)
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4646國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Prefix +-ABdividetimesCD-EF則其infix為何
Sol
+ -
A B divide times C D ndash
E F
rArr
rArr A -
B + C times
D divide
(E -
F) Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
(A-B) (CtimesD)( divide )( -
)(E-F)
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4747國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Postfix AB-uarrCDtimes+則其infix為何
Sol
A B -
uarr
C D times
+
A B -
uarr
C D times
+
rArr (( A uarr
(-B) ) + (C times
D))Hint Hint 哪個括號能拿掉哪個不能拿掉自已要會判斷哪個括號能拿掉哪個不能拿掉自已要會判斷
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4848國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 6 2 3 times divide 4 times
5 + 之値為何
Ans 9
Postfix 2 5 3 2 5 -
+ uarr times5 3 times
-
之値為何
Ans -13
Postfix 1 2
times
3 ndash
4 5 times times 6 7 times
8 divide
+之値為何
Ans -1475
Postfix a b divide
c ndash
d e times
+ a c times
-則其Prefix為何
Ans -
+ -
divide
a b c times
d e times
a c
Prefix times
+ + + a b times
c + d e f
+ g h則其Postfix為何
Ans a b + c d e + times
+ f + g h + times
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
4949國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
中序式與後序式中序式與後序式前序式互轉的演算法前序式互轉的演算法
需要堆疊(Stack)支援
討論次序
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
PostfixPostfix之計算的演算法之計算的演算法
InfixInfix轉轉PrefixPrefix的演算法的演算法 ((利用利用22個個Stack)Stack)
PrefixPrefix之計算的演算法之計算的演算法
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5050國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PostfixPostfix的演算法的演算法 ((利用利用11個個Stack)Stack)
演算法意義匯整
11中序運算式中序運算式由左往右由左往右掃描當遇到掃描當遇到
11--1 1 運算元運算元 直接輸出 (或Print) 到後序式
11--2 2 運算子運算子
11--22--1 1 ldquoldquo))rdquordquo pop堆疊內的運算子直到遇到 ldquo(rdquo
11--22--2 2 其它運算子其它運算子xx 比大小
1
若運算子x 的優先權 gt 堆疊內最Top的運算子時則將運算子x push至堆疊中
2
若運算子x的優先權 le
堆疊內最Top的運算子時則pop堆疊內的運算子直到x
gt 堆疊內最Top的運算子為止
22掃描完中序運算式則將堆疊內的掃描完中序運算式則將堆疊內的殘餘資料殘餘資料poppop完完
Note
Stack為空時其優先權最低(∵Stack沒有任何運算子可與待輸入的運算子
做比較)
ldquo(rdquo
在Stack外優先權最高但在Stack內優先權最低
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5151國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+Btimestimes(C(C--DDdividedivideE)+F E)+F 轉轉PostfixPostfix的過程的過程
1)
Print lsquoArsquo
2)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
3)
Print lsquoBrsquo
4)
lsquotimesrsquo
gt lsquo+rsquo(堆疊的top元素) push lsquotimesrsquo
5)
lsquo(rsquo
gt lsquotimesrsquo push lsquo(rsquo
6)
Print lsquoCrsquo
7)
lsquo-rsquo
gt lsquo(rsquo
(on stack) push lsquo-rsquo
8)
Print lsquoDrsquo
9)
lsquodividersquo gt lsquo-rsquo push lsquodividersquo
10)
Print lsquoErsquo
11)
lsquo)rsquo pop stack until lsquo(rsquo
1)
Pop lsquodividersquo print
2)
Pop lsquo-rsquo print
3)
Pop lsquo(rsquo 不用print
12)
lsquo+rsquo
le
lsquotimesrsquo pop lsquotimesrsquo print
13)
lsquo+rsquo
le
lsquo+rsquo pop lsquo+rsquo print
14)
lsquo+rsquo
gt 空的Stack push lsquo+rsquo
15)
Print lsquoFrsquo
16)
Scan完畢清空Stack pop lsquo+rsquo
A
+
B
times(
C -Ddivide
E divide - times + F +
Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5252國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
在執行上述轉換過程中所需之Stack Size至少需要 ge
5 個 儲存空間
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5353國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do 意義匯整意義匯整 11begin
x = NextToken Token是指運算的單元可能是運算元或是運算子if (x是operand) 意義匯整意義匯整 11--11
print(x)else
begin 意義匯整意義匯整 11--22if (x是 lsquo))rsquo
) 意義匯整意義匯整 11--22--11
beginpop(S) 直到遇見 lsquo((rsquo
為止
endelse begin 意義匯整意義匯整 11--22--22
比較 (x與stack top之優先權)- case ldquox gt toprdquo 則push(x S)- case ldquox le
toprdquo 則pop(S) 直到x gt top為止 再push(x S)
endendwhile (stack neempty) do 意義匯整意義匯整 22
pop stack
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5454國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PostfixPostfix之計算的演算法之計算的演算法
43-15times+寫出postfix計算過程 (含Stack內容)
Stack容量需至少為多少 gege33
7) lsquo+rsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 +
5 = 6 再push lsquo6rsquo
8)Scan完畢pop stack 6
1)Push lsquo4rsquo
2)Push lsquo3rsquo
3) lsquo-rsquo
1)pop lsquo3rsquo與 lsquo4rsquo
2)計算4-3 = 1 再push lsquo1rsquo
4)Push lsquo1rsquo
5)Push lsquo5rsquo
6) lsquotimesrsquo
1)pop lsquo5rsquo與 lsquo1rsquo
2)計算1 times
5 = 5 再push lsquo5rsquo Ans 6 4
311556
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5555國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
while (Infix尚未Scan完畢) do
begin
x = NextToken Token是指運算的單元可能是運算元或是運算子
if (x是operand)
push(xpush(x))
else
beginbegin
poppop適當數目的運算元適當數目的運算元
--
計算計算
--
再將計算結果再將計算結果pushpush回回stackstack
endend
end
pop stackpop stack
即為結果
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5656國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
範例練習範例練習
Postfix 526times+42divide3times-之求算過程 (含Stack內容)且 Stack Size最少需為多少
結果 = 11Stack Size ge
3
在求算Postfix ABdivideC-DEtimes+ACtimes-時Stack Size最少需 為多少
Stack Size ge
3
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5757國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue (Queue (佇列佇列))
Def
具有FIFO (First-in First-out) 性質的有序串列
插入與刪除元素的動作發生在佇列的不同端
插入動作發生在尾端 (Rear)
刪除動作發生在前端 (Front)
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5858國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Queue ExampleQueue Example
有一空的queue實施下列動作後則Queue的內容為何
add(Q a) add(Q b) delete add(Q c) delete add(Q e)
Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
5959國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的應用的應用
日常生活的排隊行為
在作業系統中的job scheduling在相同的priority下 利用queue來完成先到先作的策略
有許多的IO工作同時要處理將所有的IO要求利用 queue來達成先到先作的策略
用於模擬 (Simulation) 方面如佇列理論 (Queuing
Theory)
The two factors that most affect the performance of queues
are the arrival rate
and the service time
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6060國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的的ADTADT
Data Objects
Queue a set of data items
Front 指示Queue之前端元素所在
Rear 指示Queue之尾端元素所在
Operations
Create(Q) 建立空佇列Q
ADDQ(Q item) Q 將item插入到Queue Q中成為新的尾端元素
(if Queue is full then (if Queue is full then 無法執行無法執行))
DeleteQ(Q item) item Q 刪除Queue中的前端元素 (if Queue is (if Queue is
empty then empty then 無法執行無法執行))
IsEmpty(Q)IsEmpty(Q) Boolean
IsFull(Q)IsFull(Q) Boolean
Front(Q)Front(Q) item 傳回Queue之Front端元素 (但不刪除)
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6161國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的製作的製作
用Link list製作
Single link list
用Array製作
利用Linear Array
利用Circular Array with (n-1) space used
利用Circular Array with n space used
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6262國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用Linked list Linked list 製作製作
Create(QCreate(Q))
宣告
rear pointer = nil
front pointer = nil
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6363國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
ADDQ(Q item) ADDQ(Q item) 為說明方便起見下列的 F = front R = rear
Case 1 (當Queue為空佇列)
Case 2 (當Queue不為空佇列)
nil
F R
itemitem nilnil
itemitem nilnil
nilnil
F R
newPtr
F R
newPtr R
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6464國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
F =
front R = rear
begin
New(newPtrNew(newPtr))
newPtrnewPtr
rarrrarrdata = itemdata = item
newPtrnewPtr
rarrrarrlink = nillink = nil
if (rear = nil) then Case 1if (rear = nil) then Case 1
front = front = newPtrnewPtr
else Case 2else Case 2
rear rear rarrrarrlink = link = newPtrnewPtr
rear = rear = newPtrnewPtrend
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6565國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Delete(QDelete(Q))
nilnil
F R
itemitemdeleteLoc
F
Retbeginbegin
if (front = nil) thenQueue Empty
else begindeleteLocdeleteLoc = front= frontitem = item = frontfrontrarrrarrdatadatafront = front = frontfrontrarrrarrlinklinkRet(deleteLocRet(deleteLoc))
if (front = nil) thenif (front = nil) thenrear = nilrear = nil
endendend
bullbull
假設假設QueueQueue中只有一個中只有一個nodenode回回
收後收後把把RearRear指向指向nilnilbullbull
主要是耽心主要是耽心系統不會自動將系統不會自動將RearRear
設成設成nilnil使得使得RearRear指標指標無效無效
F
itemitem
Ret
nilnil
FR
deleteLoc
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6666國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
用用ArrayArray製作製作
利用Linear Array
利用Circular Array with (n(n--1) space1) space
used
利用Circular Array with n spacen space
used
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6767國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Linear ArrayLinear Array
Create(QCreate(Q))宣告
Q array[0hellipn-1] of items 宣告Q是一個大小為n的一維Array
Front integer = -1 初値
Rear integer = -1 初値
AddQ(QAddQ(Q item)item) QueueQueue
beginbegin
if (rear = n) then
QueueFull
else beginbegin
rear = rear
+1
Q[rear] = item
endend
endend
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6868國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(QDeleteQ(Q)) item item QueueQueue
beginbegin
if (rear = front) then
QueueEmpty
else beginbegin
front = front
+1
item = Q[front]
endend
endend
問題 當rear = n 時Queue並不代表真正為滿的情況
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
6969國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
為解決上述問題我們或許可以設計一個副程式當資料 已成長到Arrar的最末端時作一次 ldquo是否真的為滿是否真的為滿rdquo
的判
斷 (即Rear = nRear = n
且 Front = 0Front = 0)若不為真滿則需將 (Front+1)
到Rear端的所有元素往左移Front格並重設Rear與Front 的指標値
然而此種作法會導致Queue之Add動作時間為O(n)
∵是用廻圈廻圈來實作資料的搬移花費時間太大同時此搬移工作
是額外的處理項目與Add動作本身是無關的
there4當Add的工作很頻繁時整體執行效益差
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7070國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with (nCircular Array with (n--1) space used1) space used
Create(Q)
宣告
Q Array[0hellipn-1]
front = rear = 0 初値
AddQ(item Q) Queue
begin
rear = (rear+1) mod nrear = (rear+1) mod n rear指標先前進
if rear = front
QueueFull 表示Queue滿了
rear = rear-1 mod n 將rear重設回前一格
else
Q[rear]=item
end
0 1 2 hellip n-1
R R = (R+1) mod n
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7171國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if front=rear front=rear 先檢查
QueueEmpty
else begin
front = (front+1) mod n
item = Q[front]
end
end
特點最多只利用到 nn--1 1 格空間格空間
若硬要使用到 n 格空間則 rear = front 條件成立時無法真正區分出無法真正區分出
QueueQueue為為FullFull或或EmptyEmpty∵判斷Full與Empty的條件式相同 (皆為rear = Fullrear = Full)
Add與Delete之動作時間皆為O(1)O(1)∵沒有資料挪移沒有資料挪移的動作
FFRR
X
X
XX X
X
X
X
XXX
X
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7272國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
利用利用Circular Array with n space usedCircular Array with n space used
引進一個TagTag變數變數用以協助判斷協助判斷Queue為Empty或Full
該變數為Boolean型態
若Tag = True 則可協助判斷是否為Full
若Tag = False 則可協助判斷是否為Null
不是光靠不是光靠TagTag就能做正確判斷就能做正確判斷
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7373國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
Create(Q)宣告
Q Array[0hellipn-1]
front = rear int
= 0 初値
Tag Boolean = 0 初値
AddQ(item Q) Queuebegin
if (rear = front and Tag = 1)
QueueFull
else begin
rear = (rear+1) mod n rear指標前進
Q[rear]=item
if (rear=front)
Tag=1
end
end
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7474國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
DeleteQ(Q) itembegin
if (Front=Rear and Tag=0)
QueueEmpty
else begin
Front = (Front+1) mod n
item = Q[Front]
if (Front=Rear)
Tag=0
end
end
特點最多可利用到 n n 格空間格空間
Add與Delete之運作時間稍長
∵多了一條ifif測試測試來測試Tag値設定且此兩個運作使用上極頻繁
there4整體時間效益稍嫌整體時間效益稍嫌PoorPoor
FFRR
X
X
XX X
X
X
X
XXX
X
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7575國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
QueueQueue的種類的種類
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7676國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (FIFO Queue (先進先出佇列先進先出佇列))
即一般的佇列具有FIFO特性前端刪除元素尾端加入元素
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7777國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (Priority Queue (優先權佇列優先權佇列))
不一定遵守FIFO特性
運作
插入任意優先權値之元素
刪除時是刪除具最大最小優先權値之元素
可利用Heap (堆積) 來製作
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (雙邊優先佇列)
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7878國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (Double Ended Queue (雙邊佇列雙邊佇列))
可於任何一端執行插入刪除元素的動作
亦可實作成
Input-restricted插入動作在固定端刪除動作在任意端
Output-restricted插入動作在任意端刪除動作在固定端
Double Ended Priority Queue (雙邊優先佇列)
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
7979國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
FIFO Queue (先進先出佇列)
Priority Queue (優先權佇列)
Double Ended Queue (雙邊佇列)
Double Ended Priority Queue (Double Ended Priority Queue (雙邊優先佇列雙邊優先佇列))
可於任何一端執行插入元素的動作但刪除時有一端是做
Delete Max元素的動作另一端則作Delete Min元素的動作
可利用Min-Max Heap (堆積) 來製作
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
8080國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
補補 充充
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
8181國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
PrefixPrefix之計算之計算
觀念同Postfix的計算過程都是利用一個Stack
差別
由右往左Scan
Operand在pop之後的計算位置相反
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
8282國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
計算計算--timestimes+123+123dividedivide8484
8)
lsquotimesrsquo
1)
pop lsquo3rsquo與 lsquo3rsquo
2)
計算3 times
3 = 9 再push lsquo9rsquo
9)
lsquo-rsquo
1)
pop lsquo9rsquo與 lsquo2rsquo
2)
計算9 -
2 = 7 再push lsquo7rsquo
10)
Scan完畢pop stack 7
1)
Push lsquo4rsquo
2)
Push lsquo8rsquo
3)
lsquodividersquo
1)
pop lsquo8rsquo與 lsquo4rsquo
2)
計算8divide4 = 2 再push lsquo2rsquo
4)
Push lsquo3rsquo
5)
Push lsquo2rsquo
6)
Push lsquo1rsquo
7)
lsquo+rsquo
1)
pop lsquo1rsquo與 lsquo2rsquo
2)
計算1 +
2 = 3 再push lsquo3rsquo
Ans 7 482321397
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
8383國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
InfixInfix轉轉PrefixPrefix之演算法之演算法
大原則
Infix由右往左Scan
需要2個Stacks支援
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
8484國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
寫出寫出Infix A+BInfix A+BtimestimesC C 轉轉PrefixPrefix的過程的過程
1)
push lsquoCrsquo
至 Temp Stack
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
push lsquoBrsquo
至 Temp Stack
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo push into Temp
Stack
2)
Push lsquo+rsquo
into stack S
5)
push lsquoArsquo
至 Temp Stack
6)
Scan完畢清空Stack S pop
lsquo+rsquo and push into Temp Stack
7)
Pop Temp Stack內所有資料
timestimes
S TempCBtimestimes
++
A++
CBtimestimesA++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
8585國立聯合大學國立聯合大學 資訊管理學系資訊管理學系 資料結構課程資料結構課程 ((陳士杰陳士杰))
上述上述過程若沒有過程若沒有Temp StackTemp Stack會發生何事會發生何事
1)
print lsquoCrsquo
2)
lsquotimesrsquo gt 空的Stack S push lsquotimesrsquo
3)
print lsquoBrsquo
4)
lsquo+rsquo
le
lsquotimesrsquo(堆疊的top元素)
1)
pop lsquotimesrsquo print lsquotimesrsquo
2)
Push lsquo+rsquo
into stack S
5)
print lsquoArsquo
6)
Scan完畢清空Stack S pop
lsquo+rsquo and print it
由此可知Temp Stack扮演 ldquo反反 向輸出向輸出rdquo
的角色
timestimes
S
C B timestimes
++
A ++Ans
Recommended