迴圈佇列的實現及操作
阿新 • • 發佈:2018-12-17
普通的順序佇列實現有弊端(P71),用迴圈佇列實現用來解決這一弊端,同時迴圈佇列實現需要空出一個空間來,依次來區分隊滿和隊空。
他的指標是不是真正的指標變數,而是int型的,用來記錄陣列下標,起到了指標的作用。因為只有這樣才能實現取模迴圈
注意:迴圈佇列的尾指標始終指Rear向下一個空間,即為指標的上一個才是存放資料的空間。
迴圈佇列的頭指標Front始終指向最後一個有資料的空間。
如圖所示,為指標指向的空間並沒有資料,他的前一個才是存放資料的空間,頭指標指向的空間有資料。
判斷隊滿:(Q->Rear+1)%Q->MaxSize==Q->Front
判斷隊空:Q->Rear=Q->Front;
迴圈佇列的儲存結構:
typedef int QElemType;
typedef struct{
QElemType *base; //陣列,用來實現佇列
int Front; //頭指標
int Rear; //尾指標
int MaxSize //佇列最大容量
}sqQueue,*Queue;
1、迴圈佇列的初始化
Status InitQueue(Queue Q,int MaxSize){ Q=(Queue)malloc(sizeof(sqQueue)); if(Q==NULL) return ERROR; Q->base=(QElemType*)malloc(MaxSize*sizeof(QElemType)); 為佇列分配陣列空間 if(Q->base==NULL) return ERROR; Q->Front=0; //頭/尾指標置為零,佇列為空 Q->Rear=0; Q->MaxSize=MaxSize; //記錄先最大容量 return OK; }
2、求佇列的長度
int QueueLength(Queue Q){
return (Q->Rear-Q->Front+Q->MaxSize)%Q->MaxSize;
}
(尾指標-頭指標+MaxSize)%MaxSize,這是為了防止出現負數。
3、入隊
Status EnQueueL(Queue Q,QElemType X){ if((Q->Rear+1)%Q->MaxSize==Q->Front) //判斷是否隊滿 return ERROR; Q->base[Q->Rear]=X; //將資料存入 Q->Rear=(Q->Rear+1)%Q->MaxSize; //尾指標下移一位。 return OK; }
4、出隊
Status DeQueue(Queue Q,QElemType *e){ //用指標傳遞來返回值
if(Q->Front==Q->Rear) //判斷是否隊空
return ERROR;
*e=Q->base[Q->Front]; //將陣列去出
Q->Front=(Q->Front+1)%Q->MaxSize; //頭指標後移一位,即出隊
return OK;
}
不管是入隊還是出隊,都是先操作(賦值/取值)後然後指標後移一位,後移一位都是+1然後整體取模。
5、取迴圈佇列的頭元素
Status GetHead(Queue Q,QElemType *e){//用指標傳遞返回需要返回的值
if(Q->Front!=Q->Rear){
*e=Q->base[Q->Front]; //取值
return OK;
}
return ERROR;
}