• 沒有找到結果。

20 動態環狀佇列的刪除動作(Deleteq)程式

第五章 系統實作

程式 3- 20 動態環狀佇列的刪除動作(Deleteq)程式

element delete_queue( queue_pointer *front , queue_pointer

*rear )

3-7 生活實例說明

1.Stack 實例說明

1.1 基本實例

甲、 由作業系統提供的系統堆疊,主要用途在程式執 行時儲存呼叫返回位址與作業系統執行程式時的作 業記錄(Activation Record)之儲存,所儲存的有 區域變數、各形式的參數值、返回位址(Return Address)、程式執行傳回值、…等等。

乙、 Compiler 做運算式解析時使用的方法,如中序表 示的算式可將其轉換成後序式或前序式表示法。

1.2 生活實例

(1) 衣櫥中衣服的堆積,取出與放入皆在頂端。如圖 3-8。

(2) 光碟存放桶(俗稱布丁桶)。如圖 3-8。

圖 3-8 堆疊生活實例示意圖

2.Queue 實例說明

2.1 基本實例

大型主機的作業系統中,有一項機制就是工作佇列 (又稱 job spooling),他的運作方式是在一批資料輸入 時,先將它們儲存於磁碟之中,等資料讀取完備,在依據 資料要求性質作出動作,舉個例子:

當一群學生於機房下達列印資料後,主機並不會立 刻執行列印動作,而是將資料儲存於磁碟之中,待主機忙 碌之後,再將資料整批印出,此為工作佇列的運作方式.

2.2 生活實例

(1)水管中的水

假設有一連串的水流進水管中,當第一個部分的水由 水管的一端進入水管中之後,最後由水管另一端最先流出 的水一定是這一部份的水。

(2) 超市排隊付賬,先排隊者先付帳,後排隊者後付帳。

圖 3-9 佇列生活實例示意圖

3-8 應用:以單一陣列實作一個堆疊及一個佇列

2-1.佇列鄰近變數 sep_line 處的空間未使用,則將 變數 sep_line 值減一,可多出一陣列單位供堆疊 使用。但若此時變數 rear 值等於變數 sep_line 的值時,須將變數 rear 指回陣列開端,即陣列表

狀況二:佇列已滿,須向堆疊方借陣列空間,描述如下: 數 sep_line 同值的狀況,即可將變數 sep_line 的值加一,則向堆疊借空間給佇列成功。如圖 3-14 所示。

sep_line

環狀佇列部分 堆疊部分

陣列 x x 、 、 、 x x x x x x、、、x x

(Array) 0 1 、、、 size-2 size-1

front rear top

圖 3-14 佇列借用空間前的說明圖(2)

3-8-2 程式解說部分

以下將對各程式片段做詳解,如程式 3-21:

typedef struct mix_tag{ /*以結構體宣告程式基 element s[size]; 本所需的變數*/

int top,front,rear;

int sep_line;

} Mix_type;

void initialize(Mix_type *ptr) /*設定陣列的初始狀況*/

{ ptr->top = size – 1; /*堆疊初始位置*/

ptr->front = 0; /*佇列初始位置*/

pte->rear = 0;

pte->sep_line = size / 2; /*用標記將陣列畫分為

} 二*/

void stackfull(Mix_type *ptr) /*判斷堆疊滿時,所面對

{ int i; 所有狀況的副程式*/

if((( ptr->rear + 1 ) % ptr->sep_line) == ptr->front) { printf(“ Array full !! “); /*判斷佇列是否亦滿,

exit(1); 若滿則結束副程式*/

}

else if (ptr->front < ptr->rear ) /*佇列未滿且尚未環繞 { ptr->sep_line--; 至前方*/

if( ptr->rear == ptr->sep_line )/*若變數 rear 鄰近中 ptr->rear = 0; 界點,將 rear 移至陣列 ptr->front--; sep_line 中間的資料向

} 前移動一資料單位以供

} 堆疊借用*/

void queuefull(Mix_type *ptr) /*判斷佇列滿時,所面對

{ int i; 所有狀況的副程式*/

if( ptr->top + 1 == ptr->sep_line )

{ printf(“ Array full !! “); /*判斷堆疊是否亦滿,

{ ptr->s[sep_line] = ptr->s[0];

/*先將最前方資料移到 rear 所指處*/

for ( i = 1; i < ptr->rear; i++ )

ptr->s[i-1] = ptr->s[i];/*再將整個資料項前移 ptr->rear--; 一資料單位*/

}

sep_line++; /*再調整中界位置即完 ptr->front++; 成借用空間*/

} }

相關文件