1. 循環(huán)隊列的初始化
我們初始化相比鏈表而言更為簡單了,核心就在于申請空間以及將front指針和rear指針內(nèi)容賦值為0,即指向第0個元素即可(注意第 0個元素內(nèi)容為空)。
其代碼可以表示為:
//初始化 cir_queue *init(){ cir_queue *q = (cir_queue*)malloc(sizeof(cir_queue)); if(q==NULL){ exit(0); //申請內(nèi)存失敗,退出程序 } q->front=0; q->rear=0; return q; }
2. 循環(huán)隊列入隊操作
入隊操作同順序隊列的方法,直接將rear向后移動即可,但是要注意判斷,如果rear達到了隊列的空間上線,將要從頭繼續(xù)開始移動,這里推薦使用余數(shù)法,即無論如何求余都是在這片空間內(nèi)進行操作,防止一次錯誤執(zhí)行就直接整體崩潰,而且也相對而言更為簡潔,不推薦使用if語句,這樣顯得比較累贅。
注意進行加一移動位置操作的時候,不能直接q->rear++這樣的操作,這樣計算機判斷優(yōu)先級會產(chǎn)生讓自己意想不到的后果,此外這里還需要進行一次是否隊列已滿的判斷,當我們rear指針的下一個位置就是front的位置的時候,即改循環(huán)隊列已滿。
如圖:
其代碼可以表示為:
//入隊操作push void push(cir_queue *q,int data){ if((q->rear+1)%maxsize==q->front){ printf("溢出,無法入隊\n"); return; }else{ q->rear=(q->rear+1)%maxsize; q->data[q->rear]=data; } }
3. 循環(huán)隊列出隊操作
如果順序隊列的出隊操作,直接將front進行后移一位即可,注意這時候有一個需要留意的地方,即隊列是否為空,當隊列為空的時候是無法進行出隊操作的。
其代碼可以表示為:
//出隊操作pop void pop(cir_queue *q){ if(q->rear==q->front){ printf("隊列為空,無法出隊\n"); return; }else{ q->data[q->front]=0; q->front=(q->front+1)%maxsize; } }
4. 循環(huán)隊列遍歷操作
遍歷操作需要借助一個臨時變量儲存位置front的位置信息,利用i逐步向后移動,直到i到達了rear的位置即可宣告遍歷的結(jié)束。
//遍歷隊列 void print(cir_queue *q){ int i=q->front; while(i!=q->rear){ i=(i+1)%maxsize; printf("%d\t",q->data[i]); } printf("\n"); //記得換行 }
5. 本題代碼代碼
#include<stdio.h> #include<stdlib.h> #include<cstring> #define maxsize 10 //表示循環(huán)隊列的最大容量 //循環(huán)隊列的結(jié)構(gòu)設(shè)計 typedef struct cir_queue{ int data[maxsize]; int rear; int front; }cir_queue; //初始化 cir_queue *init(){ cir_queue *q = (cir_queue*)malloc(sizeof(cir_queue)); if(q==NULL){ exit(0); //申請內(nèi)存失敗,退出程序 } memset(q->data,0,sizeof(q->data)); q->front=0; q->rear=0; return q; } //入隊操作push void push(cir_queue *q,int data){ if((q->rear+1)%maxsize==q->front){ printf("溢出,無法入隊\n"); return; }else{ q->rear=(q->rear+1)%maxsize; q->data[q->rear]=data; } } //出隊操作pop void pop(cir_queue *q){ if(q->rear==q->front){ printf("隊列為空,無法出隊\n"); return; }else{ q->data[q->front]=0; q->front=(q->front+1)%maxsize; } } //遍歷隊列 void print(cir_queue *q){ int i=q->front; while(i!=q->rear){ i=(i+1)%maxsize; printf("%d\t",q->data[i]); } printf("\n"); //記得換行 } int main(){ cir_queue *q = init(); ////////////入隊操作/////////////// printf("入隊操作\n"); for(int i=1;i<=6;i++){ push(q,i); } print(q); ////////////出隊操作/////////////// printf("出隊操作\n"); for(int i=1;i<=3;i++){ pop(q); print(q); } return 0; }
6. 配套題目推薦
畢竟循環(huán)隊列只是隊列的基本優(yōu)化,可以使用普通順序隊列的練習(xí)題再度練習(xí):
1895 | 藍橋杯算法提高VIP-隊列操作 |
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程