佇列是一種先進先出的的資料結構,我們同樣可以使用陣列、連結串列等來實現。我們可以在佇列的尾部進行插入元素,在佇列的頭部取出元素。普通的佇列由於空間利用率不高,所以我們一般都用迴圈佇列。迴圈佇列中最重要的的兩個操作就是判斷是否為空和是否已滿。當head==tail時,表示佇列為空。當(tail+1)%MAX_SIZE == head,表示佇列已滿。
我判斷隊滿的方法:犧牲一個單元來區分對空和隊滿,入隊時少用一個佇列單元,相當於浪費一個儲存空間。“隊頭指標的隊尾指標的下一位置作為隊滿的標誌”。程式碼上傳至:https://github.com/chenyufeng1991/Queue_Array 。
(1)進佇列
1 2 3 4 5 6 7 8 9 10 11 12 |
//進佇列 void EnQueue(int value){ //要先判斷佇列是否已滿 if ((tail + 1) % QUEUE_SIZE == head) { printf("佇列已滿,無法從隊尾插入元素\n"); }else{ queue[tail] = value; tail = (tail + 1) % QUEUE_SIZE; } } |
(2)出佇列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//出佇列 int DeQueue(){ int temp; if (tail == head) { printf("佇列為空,元素無法出佇列\n"); }else{ temp = queue[head]; head = (head + 1) % QUEUE_SIZE; } printf("%d\n",temp); return temp; } |
(3)判斷佇列是否為空
1 2 3 4 5 6 7 8 9 10 |
//判斷佇列是否為空 int IsEmpty(){ if (head == tail) { printf("佇列為空\n"); return 1; } printf("佇列不為空\n"); return 0; } |
(4)判斷佇列是否已滿
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//判斷佇列是否已滿 /** * 我這裡判斷隊滿的的方法: 犧牲一個單元來區分隊空和隊滿,入隊時少用一個佇列單元。如果陣列的大小為Size,那麼實際只能存放(Size-1)個元素。(這是比較常用的判滿的方式) * */ int IsFull(){ if ((tail + 1) % QUEUE_SIZE == head) { printf("佇列已滿\n"); return 1; } printf("佇列未滿\n"); return 0; } |
(5)列印佇列元素
1 2 3 4 5 6 7 8 |
//列印出佇列元素 void PrintQueue(){ for (int i = head; i < tail; i++) { printf("%d ",queue[i]); } printf("\n"); } |
(6)測試程式碼
1 2 3 4 5 6 7 8 9 10 |
int main(int argc, const char * argv[]) { EnQueue(4);EnQueue(1);EnQueue(2);EnQueue(9);EnQueue(8); PrintQueue(); DeQueue();DeQueue(); PrintQueue(); return 0; } |