資料結構(嚴蔚敏)之五——迴圈佇列(c語言實現)
阿新 • • 發佈:2019-02-05
在這裡我先強調幾點概念:
1、在非空佇列中,頭指標始終指向佇列頭元素,而尾指標始終指向佇列尾元素的下一個位置。
2、在單佇列中我們判斷佇列是否為空的條件是:Q.front==Q.rear;而在迴圈佇列中只憑等式Q.front==Q.rear是無法判別佇列是“空”還是“滿”;可有兩種處理方法:其一是另設一個標誌位一區別佇列是“空”還是“滿”;其二是少用一個元素空間,約定以“佇列頭指標在佇列尾指標的下一位置(置換的下一位置)上”作為佇列呈“滿”狀態的標誌,即(Q.rear+1)%MAXQSIZE == Q.front.
佇列結構的實現:
測試程式碼:#include <stdio.h> #include <malloc.h> typedef int QElemType; typedef int Status; #define MaxQSize 10 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 typedef struct { QElemType *base; int front, rear; }SqQueue; //初始化迴圈佇列 Status InitQueue(SqQueue &Q) { Q.base = (QElemType*)malloc(MaxQSize*sizeof(QElemType)); if (Q.base == NULL) { puts("分配記憶體空間失敗!"); exit(OVERFLOW); } Q.front = Q.rear = 0; return 0; } //將迴圈佇列清空 Status ClearQueue(SqQueue &Q) { Q.front = Q.rear = 0; } //求佇列元素的個數 Status QueueLength(SqQueue Q) { return (Q.rear - Q.front + MaxQSize) % MaxQSize; } //插入元素到迴圈佇列 Status EnSqQueue(SqQueue &Q, QElemType e) { if ((Q.rear + 1) % MaxQSize == Q.front){puts("佇列已滿!"); return ERROR; /*佇列滿*/} Q.base[Q.rear] = e; //元素e入隊 Q.rear = (Q.rear + 1) % MaxQSize; //修改隊尾指標 return OK; } //從迴圈佇列中刪除元素 Status DeSqQueue(SqQueue &Q, QElemType &e) { if (Q.front == Q.rear) return ERROR; e = Q.base[Q.front]; //取隊頭元素至e Q.front = (Q.front + 1) % MaxQSize; //修改隊頭指標,如果超記憶體,迴圈 return OK; } //判斷一個迴圈佇列是否為空佇列 Status isQueueEmpty(SqQueue Q) { if (Q.front == Q.rear) return TRUE; else return FALSE; }
執行結果:int main() { int i, e; SqQueue Q; InitQueue(Q); for (i=0; i<MaxQSize; i++) //只有MaxQSize個數據進佇列 EnSqQueue(Q, i); i = QueueLength(Q); printf("佇列裡的元素有%d個\n", i); for (i=0; i<3; i++) { DeSqQueue(Q, e); printf("%d ", e); } printf("\n"); i = QueueLength(Q); printf("佇列裡的元素有%d個\n", i); for (i=10; i<12; i++) EnSqQueue(Q, i); i = QueueLength(Q); printf("佇列裡的元素有%d個\n", i); ClearQueue(Q); i = QueueLength(Q); printf("佇列裡的元素有%d個\n", i); return 0; }