標籤:順序隊列迴圈隊列 迴圈隊列的順序實現
為了能充分的利用空間,解決順序隊列的“假溢出”問題,可以採用兩種方法:一種是將資料向前移動,讓空的儲存單元留在隊尾;另一種是將順序隊列構造成一個環狀的空間,即將隊列的資料區data[0....MAXSIZE-1]看成頭尾相接的迴圈結構,使得data[0]接在data[MAXSIZE-1]之後,這就是迴圈隊列。
這節就來實現迴圈順序隊列。
迴圈隊列中的閒置空間可以被利用,除非數組空間真的被隊列元素全部佔用,否則不會上溢。因此,隊一此簡單的應用外,真正實用的順序隊列是迴圈隊列。
入隊時,隊尾指標向前追趕隊頭指標;出隊時,隊頭指標向前追趕隊尾指標。因此隊空和隊滿指標均等於隊尾指標,無法通過Q->front == Q->rear來判斷順序隊列是空還是滿。
為瞭解決這個問題,有3種方法,其一是設一個標識位,以區別順序隊列是空還是滿;其二是使用一個計數器記錄隊列中元素的總數;其三是少用一個元素空間,約定入隊前測試隊尾指標在迴圈意義下加1是否等於隊頭指標,若相等,則認為是隊滿(註:rear所指的單元始終為空白)。
這節,就先採用第二種方法,設一個計數器記錄隊列中元素的總數,用於判斷隊列空還是隊列滿。
順序隊列(迴圈隊列)類型描述:
//順序隊列的類型描述(設立計數器)#define MAXSIZE 100typedef int ElemType;typedef struct{ElemType *data;int front,rear,count;}SqQueue;基本操作:
1. 初始化順序隊列(迴圈隊列) Init_SqQueue(SqQueue* Q)
//初始化順序隊列void Init_SqQueue(SqQueue* Q){ Q->data = (SqQueue*)malloc(sizeof(SqQueue) * MAXSIZE);Q->front = Q->rear = Q->count = 0;}
2. 銷毀順序隊列(迴圈隊列)Destroy_SqQueue(SqQueue* Q)
//銷毀順序隊列void Destroy_SqQueue(SqQueue* Q){if(Q->data){free(Q->data);Q->front = Q->rear = Q->count = 0;}}
3. 清空順序隊列(迴圈隊列)Clear_SqQueue(SqQueue* Q)
//清空順序隊列void Clear_SqQueue(SqQueue* Q){Q->front = Q->rear = Q->count = 0;}
4. 判斷順序隊列(迴圈隊列)是否為空白IsEmpty_SqQueue(SqQueue* Q)
//判斷順序隊列是否為空白int IsEmpty_SqQueue(SqQueue* Q){return (Q->count == 0);}
5. 判斷順序隊列(迴圈隊列)是否已滿 iSFull_SqQueue(SqQueue* Q)
//判斷順序隊列是否已滿int iSFull_SqQueue(SqQueue* Q){return (Q->count == MAXSIZE);}
6. 求得順序隊列(迴圈隊列)的長度GetLength_SqQueue(SqQueue* Q)
//求得順序隊列的長度int GetLength_SqQueue(SqQueue* Q){return Q->count;}
7. 取得順序隊列(迴圈隊列)的的隊頭GetHead_SqQueue(SqQueue* Q,ElemType *x)
//取得順序隊列的的隊頭void GetHead_SqQueue(SqQueue* Q,ElemType *x){if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{*x = Q->data[Q->front];}}
8. 取得順序隊列(迴圈隊列)的的隊尾GetRear_SqQueue(SqQueue* Q,ElemType *x)
//取得順序隊列的的隊尾void GetRear_SqQueue(SqQueue* Q,ElemType *x){if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{*x = Q->data[Q->rear - 1];}}
9. 入順序隊列(迴圈隊列)En_SqQueue(SqQueue* Q,ElemType x)
//入順序隊列void En_SqQueue(SqQueue* Q,ElemType x){if(iSFull_SqQueue(Q)){printf("順序隊列已滿!\n");exit(0);}else{Q->data[Q->rear] = x;Q->rear = (Q->rear + 1) % MAXSIZE;Q->count++;}}
10. 出順序隊列(迴圈隊列)De_SqQueue(SqQueue* Q,ElemType *x)
//出順序隊列void De_SqQueue(SqQueue* Q,ElemType *x){if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{*x = Q->data[Q->front];Q->front = (Q->front + 1) % MAXSIZE;Q->count--;}}
11. 列印順序隊列(迴圈隊列)Print_SqQueue(SqQueue* Q)
//列印順序隊列void Print_SqQueue(SqQueue* Q){int i = 0;int j = Q->front;if(IsEmpty_SqQueue(Q)){printf("順序隊列空!\n");exit(0);}else{while(i < Q->count){printf("%d\t",Q->data[j]);j = (j + 1) % MAXSIZE;i++;}printf("\n");}}
以上,就是附設一個計數器指標來實現迴圈順序隊列。
資料結構(C實現)------- 順序隊列(迴圈隊列之計數器實現)