您好,登錄后才能下訂單哦!
/* 1、隊列:一端進(jìn),另一端出;隊列由兩個參數(shù)決定,front(頭),rear(尾); 頭指針指向頭一個元素,尾指針指向指向最后一個元素的下一存儲單元;若數(shù)組長度為n,當(dāng)元素個數(shù)為n-1時就認(rèn)為隊列已滿。r指向最后一個空的元素空間。 出隊:頭指針往上移動, 入隊:尾指針向上移動,故:靜態(tài)隊列只能是循環(huán)隊列,不然出隊的元素占用的空間 永遠(yuǎn)無法重復(fù)利用。 1):隊列的初始化:front,rear的值都是零、 2):隊列非空:front代表的是隊列的第一個元素,rear代表的是隊列的最后一個元素的下個存儲單元 3) :隊列空:front和rear的值相等,但不一定是零 4):動態(tài)隊列:鏈表實現(xiàn) 靜態(tài)隊列:數(shù)組實現(xiàn) 2、循環(huán)隊列: 出隊:f = (f+1) % 數(shù)組長度 入隊:r = (r+1) % 數(shù)組長度 +++++++++++++++++++++ + + + +<----r + + +++++++++++++++++++++ + + + c + + + +++++++++++++++++++++ + + + b + + + +++++++++++++++++++++ + + f --->+ a + + + +++++++++++++++++++++ 如何判斷循環(huán)隊列是否為空: 如果f == r 就一定為空 如何判斷隊列已滿: 1)增加一個標(biāo)志n記錄隊列元素的個數(shù),當(dāng)n = 數(shù)組長度-1時,就滿了。 2)if((r+1)%arr.length == f){ 隊列已滿 } 通常使用第二種 隊列的具體應(yīng)用: 所有和時間有關(guān)的操作都有隊列的影子。 */ #include<stdio.h> #include<malloc.h> //靜態(tài)循環(huán)隊列(數(shù)組實現(xiàn))程序演示 typedef struct Queue { int length; int *pBase; int front; int rear; }QUEUE,* PQUEUE; //初始化隊列 void init(PQUEUE pQ,int length); //判斷隊列是否已滿 bool is_full(PQUEUE pQ); //判斷隊列是否為空 bool is_empty(PQUEUE pQ); //遍歷 void traverse(PQUEUE pQ); //入隊 r = (r+1) % 數(shù)組長度 bool en_queue(PQUEUE pQ,int val); //出隊 f = (f+1) % 數(shù)組長度 bool de_queue(PQUEUE pQ,int * val); int main(void) { QUEUE q; init(&q,6); en_queue(&q,1); en_queue(&q,2); en_queue(&q,3); en_queue(&q,4); en_queue(&q,5); traverse(&q); int a = 0; de_queue(&q,&a); printf("出隊的元素是:%d\n",a); traverse(&q); getchar(); return 0; } //初始化隊列 void init(PQUEUE pQ,int length) { //分配內(nèi)存 pQ->pBase =(int *) malloc(sizeof(int) * length); pQ->length = length; pQ->front = 0; pQ->rear = 0; //下標(biāo)的都是0 } //判斷隊列是否已滿 bool is_full(PQUEUE pQ) { if((pQ->rear + 1) % (pQ->length) == pQ->front) { return true; } else { return false; } } //判斷隊列是否為空 bool is_empty(PQUEUE pQ) { if(pQ->front == pQ->rear) { return true; }else { return false; } } //入隊 bool en_queue(PQUEUE pQ,int val) { if(is_full(pQ)) { printf("隊列已滿\n"); return false; } pQ->pBase[pQ->rear] = val; //入隊,尾角標(biāo)增加 pQ->rear = (pQ->rear+1)%(pQ->length); return true; } //出隊 bool de_queue(PQUEUE pQ,int * val) { if(is_empty(pQ)){ printf("隊列已空"); return false; } *val = pQ->pBase[pQ->front]; pQ->front = (pQ->front + 1) % (pQ->length); return true; } //遍歷 void traverse(PQUEUE pQ) { int i = pQ->front; while(i !=pQ->rear) { printf("%d\t",pQ->pBase[i]); i = (i + 1) % (pQ->length); } }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。