資料結構 迴圈佇列的實現
阿新 • • 發佈:2019-01-02
一、迴圈佇列的實現
由於順序佇列的實現可能會造成假溢位,這裡引入一個迴圈佇列,當然,這裡你要知道資料在佇列中的最大規模,否則迴圈佇列慢之後想拓展就會變得非常麻煩!
要求:
實驗七、實現迴圈佇列各種基本運算的演算法
1 實驗目的
本實驗是要實現迴圈佇列的各種基本運算,通過該實驗更深刻地理解線性結構的佇列的特點。
2 實驗內容
實現迴圈佇列的各種基本運算,並在此基礎上設計一個主程式完成以下功能:
(1) 初始化佇列
(2) 判斷佇列是否非空
(3) 依次進隊元素為學號分解後的數字,如學號為20161100,則進隊元素為數字:2、0、1、6、1、1、0、0
(4) 出隊一個元素,輸出該元素
(5) 依次進隊元素9, 8, 7
(6) 全部元素出隊,輸出出隊序列
(7) 釋放佇列
具體程式碼實現如下:
#include<stdio.h> #include<stdlib.h> //******巨集定義引數****** #define OK 1 #define NO 0 #define QUEUE_MAX_SIZE 20 //******定義資料類型別名****** typedef int Status; typedef char ElemType; //******宣告資料結構****** typedef struct node { ElemType *book; int front; int rear; int QueSize; }SqQueue,*QueuePoint; QueuePoint InitQueue() { QueuePoint p=(QueuePoint)malloc(sizeof(SqQueue)); if(p==NULL) { printf("系統無足夠記憶體申請迴圈佇列頭結點!\n"); return p; } p->book=(ElemType *)malloc(QUEUE_MAX_SIZE*sizeof(ElemType)); p->front=p->rear=0; p->QueSize=QUEUE_MAX_SIZE; if(p->book == NULL) printf("迴圈佇列記憶體分配失敗!\n"); return p; } Status QueueEmpty(QueuePoint Head) { if(Head->front == Head->rear) return OK; return NO; } Status QueuePush(QueuePoint Head,ElemType ch) { if((Head->rear+1)%Head->QueSize == Head->front) { // printf("\n對不起,該佇列已滿,無法再插入資料!\n"); return NO; } Head->book[Head->rear]=ch; Head->rear=(Head->rear+1)%Head->QueSize; return OK; } Status QueuePop(QueuePoint Head,ElemType *ch) { if(Head->front == Head->rear) { // printf("\n對不起,佇列已空!\n"); return NO; } *ch=Head->book[Head->front]; Head->front=(Head->front+1)%Head->QueSize; return OK; } int main() { QueuePoint Head; ElemType ch; Head=InitQueue(); printf("%s\n",QueueEmpty(Head)?"該棧為空!":"該棧非空!"); while((ch=getchar())!='\n') QueuePush(Head,ch); QueuePop(Head,&ch); printf("%c\n",ch); while((ch=getchar())!='\n') QueuePush(Head,ch); while(QueuePop(Head,&ch)) printf("%c",ch); free(Head->book); free(Head); printf("\n迴圈佇列操作結束!\n"); return 0; }
總結:
迴圈佇列要掌握對佇列長度的計算和公式推理 Length=(Q.rear-Q.front+Q.MaxSize)%Q.MaxSize。