資料結構(data structures) -...

85
授課教師:陳士杰 授課教師:陳士杰 國立聯合大學 國立聯合大學 資訊管理學系 資訊管理學系 資料結構 資料結構 (Data Structures) (Data Structures) Course 5: Stack and Queue Course 5: Stack and Queue

Upload: others

Post on 27-Sep-2019

15 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

授課教師陳士杰授課教師陳士杰國立聯合大學國立聯合大學 資訊管理學系資訊管理學系

資料結構資料結構(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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 2: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 3: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 4: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 5: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 6: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 7: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 8: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 9: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 10: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 11: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 12: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 13: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 14: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 15: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 16: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 17: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 18: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 19: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 20: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 21: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 22: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 23: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 24: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 25: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 26: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 27: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 28: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 29: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 30: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 31: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 32: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 33: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 34: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 35: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 36: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 37: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 38: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 39: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 40: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 41: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 42: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 43: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 44: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 45: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 46: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 47: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 48: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 49: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 50: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 51: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 52: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 53: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 54: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 55: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 56: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 57: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 58: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 59: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 60: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 61: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 62: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 63: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 64: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 65: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 66: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 67: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 68: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 69: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 70: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 71: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 72: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 73: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 74: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 75: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 76: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 77: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 78: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 79: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 80: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 81: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 82: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 83: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 84: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事
Page 85: 資料結構(Data Structures) - debussy.im.nuu.edu.twdebussy.im.nuu.edu.tw/sjchen/Datastructure/98/course05.pdf · 國立聯合大學資訊管理學系 資料結構課程(陳士杰)

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

  • 資料結構(Data Structures)Course 5 Stack and Queue
  • Outlines
  • Stack (堆疊)
  • Stack之ADT
  • 投影片編號 5
  • 練習範例1
  • 練習範例 2
  • Stack 的排列組合問題(Stack Permutation)
  • 投影片編號 9
  • Stack之製作
  • 用Linked List製作Stack
  • Create(S)
  • Push(S item)
  • 投影片編號 14
  • Pop(S)
  • 投影片編號 16
  • Top(S)
  • IsFull(S)
  • IsEmpty(S)
  • 用Array製作Stack
  • Create(S)
  • Push(S item)
  • Pop(S)
  • Top(S)
  • IsEmpty(S)
  • IsFull(S)
  • Stack Application
  • Procedure CallRecursive Call (副程式遞迴呼叫)
  • Parsing (剖析)
  • Reversing Data (反轉資料)
  • Infix與PrefixPostfix間互轉
  • 投影片編號 32
  • 投影片編號 33
  • 投影片編號 34
  • 投影片編號 35
  • 投影片編號 36
  • 中序式與後序式前序式互轉的計算
  • 中序式轉後序式前序式
  • 投影片編號 39
  • 投影片編號 40
  • 投影片編號 41
  • 投影片編號 42
  • 範例練習
  • 後序式前序式轉中序式
  • 投影片編號 45
  • 投影片編號 46
  • 投影片編號 47
  • 範例練習
  • 中序式與後序式前序式互轉的演算法
  • Infix轉Postfix的演算法 (利用1個Stack)
  • 寫出Infix A+B(C-DE)+F 轉Postfix的過程
  • 投影片編號 52
  • 投影片編號 53
  • Postfix之計算的演算法
  • 投影片編號 55
  • 範例練習
  • Queue (佇列)
  • Queue Example
  • Queue的應用
  • Queue的ADT
  • Queue的製作
  • 用Linked list 製作
  • 投影片編號 63
  • 投影片編號 64
  • 投影片編號 65
  • 用Array製作
  • 利用Linear Array
  • 投影片編號 68
  • 投影片編號 69
  • 利用Circular Array with (n-1) space used
  • 投影片編號 71
  • 利用Circular Array with n space used
  • 投影片編號 73
  • 投影片編號 74
  • Queue的種類
  • 投影片編號 76
  • 投影片編號 77
  • 投影片編號 78
  • 投影片編號 79
  • 投影片編號 80
  • Prefix之計算
  • 計算-+12384
  • Infix轉Prefix之演算法
  • 寫出Infix A+BC 轉Prefix的過程
  • 上述過程若沒有Temp Stack會發生何事