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