1. 程式人生 > >迴圈佇列的實現及操作

迴圈佇列的實現及操作

普通的順序佇列實現有弊端(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;
}