1. 程式人生 > >資料結構(c語言)——順序佇列儲存結構及實現

資料結構(c語言)——順序佇列儲存結構及實現

使用迴圈佇列,避免出現偽滿佇列的情況

  • 判斷佇列為空的條件:rear == front;
  • 判斷佇列為滿的條件:(rear+1)%MAXSIZE == front;

空出一個數組元素空間,用以區別開來滿佇列和空佇列。

一個順序佇列的結構: 

typedef struct{
    // 定義一個數組用來儲存所有的資料元素
    Element data[MAXSIZE];
    // 第一個元素下標
    int front;
    // 最後一個元素的下標
    int rear;
}SqQueue;

對順序佇列的操作:

// 初始化一個線性表
SqQueue* InitSQueue(){
    SqQueue *sq = (SqQueue *)malloc(sizeof(SqQueue));

    if(!sq){
        exit(0);
    }
    sq->front = 0;
    sq->rear = 0;

    return sq;
}

// 判斷是否為空的佇列
bool SQueueEmpty(SqQueue *sq){
    return sq->rear == sq->front;
}
// 是否為滿的佇列
bool SQueueFull(SqQueue *sq){
    return (sq->rear+1)%MAXSIZE == sq->front;
}

Status EnSQueue(SqQueue *sq,Element v){
    // 判斷佇列是否已滿
    if(SQueueFull(sq)){
        return ERROR;
    }

    // 進佇列,插入資料後隊尾指標後移
    sq->data[sq->rear] = v;
    sq->rear = ++sq->rear%MAXSIZE;
    return OK;
}
Status DeSQueue(SqQueue *sq,Element *v){
    // 判斷佇列是否是空佇列
    if(SQueueEmpty(sq)){
        return ERROR;
    }
    // 出佇列,取出資料後隊頭指標後移
    *v = sq->data[sq->front];
    sq->front = ++sq->front%MAXSIZE;
    return OK;
}

// 列印佇列
void PrintSQueue(SqQueue *sq){
    if(!SQueueEmpty(sq)){
        printf("棧內的元素依次是:[");
        for (int i = sq->front; i!=sq->rear; i = (i+1)%MAXSIZE) {
            printf("%d",sq->data[i]);
            if((i+1)%MAXSIZE != sq->rear){
                printf(", ");
            }
    }
    printf("]\n");
    }
}

測試程式碼:

int TestSQueue(){
    SqQueue *sq = InitSQueue();
    SQueueCreate(sq,5);
    Element a;
    Element *resP;
    resP = &a;
    DeSQueue(sq,resP);
    printf("%d 元素出佇列\n",*resP);

    EnSQueue(sq,5);
        printf("元素入佇列\n");
    DeSQueue(sq,resP);
        printf("%d 元素出佇列\n",*resP);
    DeSQueue(sq,resP);
        printf("%d 元素出佇列\n",*resP);
    EnSQueue(sq,6);
        printf("元素入佇列\n");
    EnSQueue(sq,7);
        printf("元素入佇列\n");
    DeSQueue(sq,resP);
        printf("%d 元素出佇列\n",*resP);
    PrintSQueue(sq);
    return 0;
}

執行結果:

相關推薦

no