基於上述佇列ADT結構體的聲明,我們可以設計兩個函數:一個用於判斷佇列是否為空,另一個用於刪除佇列前端的元素。這裡,我們將假設front的初始值為0,rear的初始值也為0,並且當front == rear時,佇列被認為是空的。這種實現方式簡單明瞭,適合教學和基本使用。
判斷佇列是否為空的函數
#include <stdbool.h> // 引入stdbool.h以使用bool類型
// 判斷佇列是否為空
bool isQueueEmpty(Queue q) {
return q.front == q.rear; // 如果front和rear相等,則佇列為空
}
這個函數返回true如果佇列為空,否則返回false。這種判斷方式適用於front和rear初始化為相同值(例如0)的情況,並且在每次添加或刪除元素時適當更新這些值。
刪除佇列前端元素的函數
在進行刪除操作時,我們需要注意只有當佇列不為空時才可以刪除元素。刪除操作通常包括移除佇列前端的元素,並更新front變數。
#include <stdio.h>
// 刪除佇列前端的元素
void dequeue(Queue *q) {
if (isQueueEmpty(*q)) { // 先判斷佇列是否為空
printf("佇列為空,無法刪除元素。\n");
} else {
q->front = (q->front + 1) % MaxQueueSize; // 移動front指標
}
}
這裡使用了取模運算子%來確保front指標在達到陣列的末尾時能夠正確迴圈回陣列的開始位置,這是一種常見的處理迴圈佇列的方法。然而,這種方法假設你在佇列實現中使用了迴圈佇列的策略。如果你沒有使用迴圈佇列(即佇列一旦滿了就不能再添加元素,即使中間有空位),則不需要% MaxQueueSize這部分。
注意,這裡的dequeue函數沒有返回被刪除的元素。在實際應用中,你可能希望函數能夠返回被刪除的元素值,特別是在佇列中存儲的不僅僅是整數,而是更複雜資料結構時。這可以通過修改函數的簽名和實現來實現,例如通過讓函數返回被刪除的元素,或者通過傳入一個指標參數來存儲被刪除的元素。