隊列的基本操作


隊列即可以用鏈表實現也可以用順序表實現,跟棧相反的是,棧一般用順序表實現而隊列用鏈表來實現,簡稱為鏈隊列,我們將隊頭指針指向鏈隊列的頭結點,隊尾指針指向終端結點(頭結點不是必要的,但為了方便操作我們加上了頭結點)。

一、隊列的鏈式存儲

1、鏈隊列的存儲結構

//隊列的存儲結構
typedef struct QNode{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
    QueuePtr front; //隊頭指針 
    QueuePtr rear; //隊尾指針 
}LinkQueue;

 2、初始化一個隊列

創建一個隊列要完成兩個任務,一是在內存中創建一個頭結點,二是將隊列的頭指針和頭結點指向這個生成的頭結點,此時是空隊列

//創建一個隊列
Status InitQueue(LinkQueue &q){
    q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
    if( !q->front )
        exit(0);
    q->front->next = NULL;
    return OK;
} 

3、入隊操作

//入隊操作
Status InsertQueue(LinkQueue &q, ElemType e){
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    if( p == NULL )
        exit(0);
    p->data = e;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
    return OK;
}

4、出隊操作

//出隊操作
Status DeleteQueue(LinkQueue &q, ElemType &e){
    QueuePtr p;
    if(q->front == q->rear)
        return ERROR;
    p = q->front->next;
    e = p->data;
    q->front->next = p->next;
    if( q->rear == p )
        q->rear = q->front;
    free(p);
    return OK;
}

5、銷毀一個隊列

//銷毀一個隊列
DestroyQueue(LinkQueue &q){
    while( q->front ){
        q->rear = q->front->next;
        free(q->front);
        q->front = q->rear;
    }
    return OK;
}

二、隊列的順序存儲

1、定義一個循環隊列

//定義一個循環隊列
#define MAXSIZE 100
typedef struct{
    ElemType *base; //用於存放內存分配基地址
    int front;
    int rear; 
}; 

2、初始化循環隊列

//初始化循環隊列
Status InitQueue(SqQueue &q){
    q->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
    if( !q->base )
        exit(0);
    q->front = q->rear = 0;
    return OK;
} 

3、入隊操作

//入隊列操作
Status InsertQueue(SqQueue &q,ElemType e){
    if( (q->rear+1)%MAXSIZE == q->front )
        return ERROR;  //隊滿
    q->base[q->rear] = e;
    q->rear = (q->rear+1)%MAXSIZE;
    return OK; 
}

4、出隊操作

//出隊操作
Status DeleteQueue(SqQueue &q,ElemType &e){
    if(q->front = q->rear)
        return ERROR;
    e = q->base[q->front];
    q->front = (q->front+1)%MAXSIZE;
    return OK;    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM