同樣的,讓我們舉個實例:相對於堆疊的疊盤子,你可以把佇列想像成一個正在排隊買甜甜圈的隊伍。每執行一次 "delete" 的動作就像是隊伍最前端,成功的買到甜甜圈而離開隊伍。而執行一次 "add" 就像是多了一個想買甜甜圈的客人,而在隊伍的最後端開始排隊(請忽略掉插隊問題)。
也因此,不同於堆疊的 LIFO,佇列的操作方式被稱為 FIFO (First In First Out,先入先出)。換句話說,就是越早加入佇列的人(資料)會越早離開佇列。
所以,佇列的應用範圍也相當廣泛。從剛剛舉例說明的排隊、圖形的廣度追蹤、使用印表機時的列印佇列等等,都可以見到佇列應用的蹤影。
而模擬一個佇列的運作,最簡單的方式還是使用陣列。同樣定義一個大小為 MAX_SIZE 的陣列,並使用兩個變數 front 與 rear 分別代表佇列的前後端。以下是一個簡易佇列實現的虛擬碼實例:
void add(Queue &queue, Type data) { Index front, rear; if (rear = MAX_SIZE) { print("The queue is full!"); } else { stack[rear] = data; rear = rear + 1; } } void delete(Queue &queue) { Index front, rear; if (front = rear) { print "The queue is empty!"; } else { front = front + 1; } }
同樣的,陣列之外模擬方式與 C++ STL 實現的佇列相關函式這裡我們不討論,請有興趣者自行查詢相關資料。
以下是 C 使用陣列實現的原始碼,可以參考看看:
#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 void addQ(int); void deleteQ(void); int queue[MAX_SIZE], front = 0, rear = 0; int main(void) { addQ(0); addQ(1); deleteQ(); addQ(2); addQ(3); addQ(4); deleteQ(); deleteQ(); addQ(5); addQ(6); addQ(7); deleteQ(); deleteQ(); deleteQ(); deleteQ(); deleteQ(); system("pause"); } void addQ(int data) { if (rear == MAX_SIZE) { printf("The queue is full!\n"); } else { queue[rear++] = data; } } void deleteQ(void) { if (front == rear) { printf("The stack is empty!\n"); } else { printf("%d\n", queue[front++]); } }
2 回覆:
轉貼文章於
http://www.facebook.com/inbox/?ref=mb#/home.php?filter=app_2309869772
如果有不妥 請通知我 我會馬上刪除 謝謝
沒問題, 歡迎引用:)
張貼留言