Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的機入與刪除 3.3 佇列的加入與刪除 3.4 環狀佇列

Slides:



Advertisements
Similar presentations
工職數學 第四冊 第一章 導 數 1 - 1 函數的極限與連續 1 - 2 導數及其基本性質 1 - 3 微分公式 1 - 4 高階導函數.
Advertisements

不定積分 不定積分的概念 不定積分的定義 16 不定積分的概念 16.1 不定積分的概念 以下是一些常用的積分公式。
資料結構與演算法 課程教學投影片.
第一單元 建立java 程式.
4-1 認識堆疊 4-2 堆疊的應用 4-3 算術運算式的求值 4-4 中序法轉換為前序法 4-5 前序與後序式轉換成中序式
遞迴關係-爬樓梯.
高考新改革与过渡 怀化市铁路第一中学 向重新.
崇拜即將開始,請大家安靜片刻, 預備心靈敬拜上帝。
第四章 數列與級數 4-1 等差數列與級數 4-2 等比數列與級數 4-3 無窮等比級數 下一頁 總目錄.
Project 2 JMVC code tracing
Chapter 5 迴圈.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
資料結構 第3章 鏈結串列.
第 3 章 堆疊與佇列.
課程名稱:資料結構 授課老師:_____________
佇列與推疊 (Queue and Stack)
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
資料結構簡介.
Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的加入與刪除 3.3 佇列的加入與刪除 3.4 其他型式的佇列
第三章 堆疊與佇列 Stacks & Queues
Chap 3 堆疊與佇列 Stack and Queue.
2-3 基本數位邏輯處理※.
4 堆疊與佇列 4.1 前言 四種基本的資料結構 (可儲存資料的容器) 陣列 (Array)、串列(List): 最基本
(Circular Linked Lists)
堆疊簡介 遞迴 佇列 算術運算式的表示法 中序轉換為前序或後序 前序與後序轉換成中序
堆疊 Stack chapter 4 德明科技大學資訊科技系.
資料結構與演算法 第三章 堆疊和佇列 徐熊健.
第五章 堆疊 5-1 認識佇列 5-2 佇列的應用.
Chapter 3 堆疊與佇列 ( Stacks and Queues ).
Chapter 4 堆疊和佇列 資料結構導論 - C語言實作.
資料結構使用Java 第8章 佇列(Queue).
4.1 單向鏈結串列 4.2 堆疊的加入與刪除 4.3 佇列的加入與刪除 4.4 其他型式的佇列
Chap3 Linked List 鏈結串列.
第一章 直角坐標系 1-1 數系的發展.
第四章 堆疊與佇列 課前指引 資料結構學科中,堆疊(Stack)與佇列是兩種相當典型的抽象資料型態,也是一種有特定進出規則的線性串列應用,主要特性是限制了資料插入與刪除的位置和方法。本章中將會介紹堆疊與佇列的概念與特性,及在計算機領域的各種相關應用。
第 四 章 堆疊(Stack) 課程名稱:資料結構 授課老師:________ 2019/2/23.
第一單元 建立java 程式.
Chapter 4 資料結構.
Chapter 4 資料結構.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
Definition of Trace Function
第一次Labview就上手 參考書籍: LabVIEW for Everyone (Jeffrey Travis/Jim Kring)
CH05. 選擇敘述.
挑戰C++程式語言 ──第8章 進一步談字元與字串
Chap2 Stack & Queue.
進階佇列.
如何使用Gene Ontology 網址:
C qsort.
Chap2 Stack & Queue.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
MiRanda Java Interface v1.0的使用方法
陣列與結構.
資料結構使用Java 第7章 堆疊(Stack).
第4章 堆疊和佇列 資料結構設計與C++程式應用
11058: Encoding ★☆☆☆☆ 題組:Problem Set Archive with Online Judge
例題 1. 多項式的排列 1-2 多項式及其加減法 將多項式 按下列方式排列: (1) 降冪排列:______________________ (2) 升冪排列:______________________ 排列 降冪:次數由高至低 升冪;次數由低至高.
1-1 二元一次式運算.
第一章 直角坐標系 1-3 函數及其圖形.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
計算機程式設計 老師:謝孟諺 助教:楊斯竣.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
Chapter 4 Multi-Threads (多執行緒).
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
7. 三角學的應用 正弦公式 餘弦公式 a2 = b2 + c2 - 2bc cos A b2 = a2 + c2 - 2ac cos B
第三章 比與比例式 3-1 比例式 3-2 連比例 3-3 正比與反比.
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

Chapter 3 堆疊與佇列 3.1 堆疊和佇列基本觀念 3.2 堆疊的機入與刪除 3.3 佇列的加入與刪除 3.4 環狀佇列 3.5 堆疊與佇列的應用 3.6 如何計算後續表示法

堆疊與佇列 堆疊與佇列是資料結構最基本的二個主題,您將會體會以前您所學到的副程式的呼叫,它們是怎麼處理的,為何會有條不紊,不會出差錯。中序的表示式與後序的表示式有何不同,它們之間應如何轉換。

3.1 堆疊和佇列基本觀念 堆疊是一有序串列(order list),其加入(insert)和刪除(delete)動作都在同一端,此端通常稱之為頂端(top)。 加入一元素於堆疊,此動作稱為推入(push),與之相反的是從堆疊中刪除一元素;此動作稱為彈出(pop)。 由於堆疊具有先進去的元素最後才會被搬出來的特性,所以又稱堆疊是一種後進先出(Last In First Out,LIFO)串列。

3.1 堆疊和佇列基本觀念 佇列也是屬於線性串列,與堆疊不同的是加入和刪除不在同一端,刪除的那一端為前端(front),而加入的一端稱為後端(rear)。 由於佇列具有先進先出(First In First Out,FIFO)的特性,因此也稱佇列為先進先出串列,假若佇列兩端皆可做加入或刪除的動作,則稱之為雙佇列(double-ended queue,deque)。

3.1 堆疊和佇列基本觀念 堆疊、佇列如圖3.1之(a)、(b)所示。

3.1 堆疊和佇列基本觀念 其中(a)堆疊有如一容器,而(b)的佇列有如一排隊的隊伍,最前面的是front所指的地方,因此front所指的位置一定會先被服務,而rear所指的地方是新加入的位置。

3.2 堆疊的加入與刪除 我們可以設定一陣列來表示堆疊,此堆疊是有最大容量的,如 int a[10]; 3.2 堆疊的加入與刪除 我們可以設定一陣列來表示堆疊,此堆疊是有最大容量的,如 int a[10]; 表示此陣列的最大容量是10個元素。除了有一陣列外,我們也指定了一個變數top做為追蹤目前堆疊的位置。 top的初始值為-1。

3.2 堆疊的加入與刪除 加入一元素(push an item)到堆疊,主要考慮會不會因為加入此一元素而溢位(overflow),亦即加入時要考慮不可超出堆疊的最大容量。 若沒有超出,則先將top加入,再將元素填入a[top]中。

3.2 堆疊的加入與刪除

3.2 堆疊的加入與刪除 加入一元素10於堆疊的片段程式如下:

3.2 堆疊的加入與刪除 從堆疊刪除一元素,等於從堆疊彈出(pop)一元素,此時我們必須注意堆疊是否為空的,亦即top的值為-1。 3.2 堆疊的加入與刪除 從堆疊刪除一元素,等於從堆疊彈出(pop)一元素,此時我們必須注意堆疊是否為空的,亦即top的值為-1。 若不是空的,表示堆疊有元素存在,此時,先將a[top]的元素移除,之後將top減1。

3.2 堆疊的加入與刪除 以下是其程式片段

3.3 佇列的加入與刪除 佇列的操作行為是先進先出,我們可以假想在一陣列中有二端分別為front和rear端,每次加入都加在rear端,而刪除(即將被服務)的在front端。 一開始,佇列的front=-1,rear=-1,當加入一元素到佇列時,主要判斷rear是否會超過其陣列的最大容量。

3.3 佇列的加入與刪除 當rear為MAX-1時,表示陣列已到達最大容量了,此時不能再加任何元素進來;反之,則陣列未達最大容量,因此可以加入任何元素。 以下是其片段程式:

3.3 佇列的加入與刪除 而刪除佇列的元素則需考慮佇列是空的情況,因為佇列為空時,表示沒有元素在佇列中,怎能刪除呢?當front >= rear時,則表示佇列是空的,其片段程式如下:

3.3 佇列的加入與刪除 上述的佇列是線性佇列(linear queue),表示的方式為Q(0: MAX-1),但此線性佇列,不太合理的現象就是當rear到達MAX-1時,無論如何的加入皆是不允許的,因為上述的加入片段程式會印出佇列是滿的訊息,因此它沒考慮佇列的前面是否還有空的位子

3.4 環狀佇列 為了解決此一問題,佇列常常以環狀佇列(circle queue)來表示之,CQ(0: MAX-1),如圖所示:

3.4 環狀佇列 3.4.1 環狀佇列的加入 環狀佇列的初始值為front=rear=MAX-1,當有元素欲加入時,利用下一敘述 3.4 環狀佇列 3.4.1 環狀佇列的加入 環狀佇列的初始值為front=rear=MAX-1,當有元素欲加入時,利用下一敘述 rear=(rear+1) % MAX;

3.4 環狀佇列 求出rear,主要的用意在於能夠使rear回到前面,看看是否還有空的位置可放。如當rear為MAX-1時,((MAX-1)+1)% MAX,其餘數為0,此時便可進入環狀佇列的前端了。

3.4 環狀佇列 以下是我們設計的片段程式

3.4 環狀佇列 而環狀佇列的刪除,乃判斷front是否和rear同在一起,若是,則印出環狀佇列是滿的訊息,否則,將front往前移,並加入元素,以下是其片段程式:

3.4 環狀佇列 其中 front = (front+1) % MAX ; 3.4 環狀佇列 其中 front = (front+1) % MAX ; 主要的用意,乃希望能將front移到0的位置。讀者是否發現到以上的片段程式有什麼怪異的地方嗎?有的,我們發現環狀佇列會浪費一個空間,如圖所示:

3.4 環狀佇列 當rear為MAX-2,front為MAX-1,此時若加入一元素,我們所設計的片段程式會發生“滿”的訊息,主要的用意在於能確保刪除時是正確的。 假若,您不理會也將它加入的話,此時刪除一元素時,則會發生佇列是空的,不合理吧!

front = rear = MAX-1 及 tag = 0 3.4 環狀佇列 有沒有方法可以充份的利用此一空間呢?有的,只是需要多加一判斷的變數如tag來輔助之。開始時 front = rear = MAX-1 及 tag = 0

3.4 環狀佇列 加入的片段程式

3.4 環狀佇列 比較encqueue和encqueue2函數,主要差異在於後者多了tag變數的判斷,因此會多花一些時間,但也可以省一個空間,這就是時間和空間的取捨囉!

3.4 環狀佇列 刪除的片段程式

3.4 環狀佇列 加入和刪除主要差異在於tag,當tag為1時,表示環狀佇列是滿的,反之tag為0,則表示環狀佇列是空的。

3.5 堆疊與佇列的應用 由於堆疊具有先進後出的特性,因此凡是具有後來先處理的性質,皆可使用堆疊來解決。 3.5 堆疊與佇列的應用 由於堆疊具有先進後出的特性,因此凡是具有後來先處理的性質,皆可使用堆疊來解決。 例如副程式的呼叫(subroutine calls)

3.5 堆疊與佇列的應用 假如所要解決的問題是有先進先出的性質時,則宜用佇列來解決,例如作業系統的工作安排(job scheduling),若不考慮特權(priority)的話。

3.5 堆疊與佇列的應用 堆疊還有一些很好的用途,就是如何將算術運算式由中序表示式變為後序表示式。一般的算術運算式皆是以中序法來表示,亦即運算子(operator)置於運算元(operand)的中間。 而後序法表示運算子在其運算元後面,如:A * B / C,此乃中序表示式,而其後序表示式是AB * C /。

3.5 堆疊與佇列的應用 其實算術運算式由中序變為後序可依下列三步驟進行即可: 3.5 堆疊與佇列的應用 其實算術運算式由中序變為後序可依下列三步驟進行即可: 將式子中的運算單元適當的加以括號,此時須考慮運算子的運算優先順序。 將所有的運算子移到其對應的右括號。 將所有的括號去掉。

3.5 堆疊與佇列的應用 如將A*B/ C化為後序表示式,步驟如下: ((A* B)/ C) ((AB)* C)/ AB*C/

3.5 堆疊與佇列的應用 再舉一例將A-B/ C+D*E化成後序表示式,步驟如下: ((A-(B/C))+(D*E)) 3.5 堆疊與佇列的應用 再舉一例將A-B/ C+D*E化成後序表示式,步驟如下: ((A-(B/C))+(D*E)) ((A(BC)/)-(DE)*)+ ABC/-DE*+

3.5 堆疊與佇列的應用

3.5 堆疊與佇列的應用 將算術運算式由中序表示改變為後序表示式,除了上述的方法,也可以利用堆疊的觀念來完成。 3.5 堆疊與佇列的應用 將算術運算式由中序表示改變為後序表示式,除了上述的方法,也可以利用堆疊的觀念來完成。 首先要了解算術運算子的in-stack(在堆疊中)與in-coming(在運算式中)的優先順序。

3.5 堆疊與佇列的應用

3.5 堆疊與佇列的應用 開始時堆疊是空的,假設稱運算式中的運算子和運算元是token,當token是運算元,不必考慮,一律輸出,但是如果進來的token是運算子,而且若此運算子的in-stack priority(ISP)大於或等於in-coming priority(ICP),則輸出放在堆疊的運算子,繼續執行到ISP<ICP,之後再將欲進來的運算子放入堆疊中。

3.5 堆疊與佇列的應用 首先以A+B*C來說明,其情形如下:

3.5 堆疊與佇列的應用 再舉一例,如A*(B+C)*D

3.5 堆疊與佇列的應用

3.5 堆疊與佇列的應用 至於佇列的應用,舉凡銀行櫃台的服務、停車場的問題、大型計算機中心列印報表的情形,以及飛機起飛與降落等等的應用。

3.6 如何計算後序表示式 將中序表示式轉為後序表示式後,就可以很容易將此式子的值計算出來,其步驟如下: 將此後序表示式以一字串表示之。 3.6 如何計算後序表示式 將中序表示式轉為後序表示式後,就可以很容易將此式子的值計算出來,其步驟如下: 將此後序表示式以一字串表示之。 每次取一token,若此token為一運算元則將它push到堆疊,若此token為一運算子,則自堆疊pop出二個運算元並做適當的運算,若此token為‘\0’則goto步驟4。

3.6 如何計算後序表示式 將步驟2的結果再push到堆疊,goto步驟2。 3.6 如何計算後序表示式 將步驟2的結果再push到堆疊,goto步驟2。 彈出堆疊的資料,此資料即為此後序表示式計算的結果。我們以下例說明之,如有一中序表示式為10+8-6*5轉為後序表示式為10 8 + 6 5 * -,今將利用上述的規則執行之,步驟如下: 因為10為一運算元,故將它push到堆疊,同理8也是,故堆疊有2個資料分別為10和8。

3.6 如何計算後序表示式 之後的token為+,故pop出堆疊的8和10做加法運算,結果為18,再次將18push到堆疊。 3.6 如何計算後序表示式 之後的token為+,故pop出堆疊的8和10做加法運算,結果為18,再次將18push到堆疊。 接下來將6和5 push到堆疊。

3.6 如何計算後序表示式 之後的token為*,故pop 5和6做乘法運算為30,並將它push到堆疊。 3.6 如何計算後序表示式 之後的token為*,故pop 5和6做乘法運算為30,並將它push到堆疊。 之後的token為-,故pop 30和18,此時要注意的是18減去30,答案為-12(是下面的資料減去上面的資料)