第五章 系統實作
程式 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++; 成借用空間*/
} }