隊列結(jié)構(gòu)

什么是隊列

隊列是一種操作受限的線性表,其限制條件為允許在表的一端進(jìn)行插入,而在表的另一端進(jìn)行刪除。插入的一端叫做隊尾,刪除的一端叫做隊頭。向隊列中插入新元素的行為稱為進(jìn)隊,從隊列中刪除元素的行為稱為出隊。

隊列的特點

隊列的特點是先進(jìn)先出。舉例:火車從山洞一端開進(jìn),從山洞另一端開出,車廂好比一個個元素,最先進(jìn)入山洞的車廂先出,后進(jìn)山洞的車廂后出。

循環(huán)隊列

循環(huán)隊列的結(jié)構(gòu):

20170305131448402.jpg

代碼:

typedef struct SqQueue{  
    int data[maxsize];  
    int front;//隊首指針  
    int rear;//隊尾指針  
}SqQueue;

循環(huán)隊列的狀態(tài)

(1)隊空狀態(tài):

qu.front ==qu.rear

(2)隊滿狀態(tài)

(qu->rear+1)%maxsize ==qu->front 

循環(huán)隊列的操作

(1)進(jìn)隊列

qu->rear=(qu->rear+1)%maxsize;  
qu->data[qu->rear]=x; 

(2)出隊列

*y=qu->data[qu->front];  
qu->front=(qu->front+1)%maxsize;

循環(huán)隊列的實現(xiàn)

#include<stdio.h>  
#include<stdlib.h>  
#define maxsize 50  
typedef struct SqQueue{  
    int data[maxsize];  
    int front;//隊首指針  
    int rear;//隊尾指針  
}SqQueue;  
//創(chuàng)建循環(huán)隊列  
SqQueue initQueue(){  
    SqQueue *sq=(SqQueue *)malloc(sizeof(SqQueue));  
    if(sq ==NULL){  
        return;  
    }  
    sq->rear=sq->front=0;  
    return *sq;  
}  
//判斷循環(huán)隊列是否為空  
int isEmpty(SqQueue qu){  
    return (qu.front ==qu.rear?1:0);  
}  
//元素進(jìn)循環(huán)隊列  
int enQueue(SqQueue *qu,int x){  
    if((qu->rear+1)%maxsize ==qu->front){  
        return 0;  
    }  
    qu->rear=(qu->rear+1)%maxsize;  
    qu->data[qu->rear]=x;  
    return 1;  
}  
//元素出循環(huán)隊列  
int deQueue(SqQueue *qu,int *y){  
    if(qu->rear ==qu->front){  
        return 0;  
    }  
    *y=qu->data[qu->front];  
    qu->front=(qu->front+1)%maxsize;  
    return 1;  
}  
//打印循環(huán)隊列  
int printQueue(SqQueue qu){  
    if(qu.rear ==qu.front){  
        return 0;  
    }  
    while(qu.rear !=qu.front){  
        qu.front=(qu.front+1)%maxsize;  
        printf("當(dāng)前隊列值=%d\n",qu.data[qu.front]);  
    }  
    return 1;  
}  
void main(){  
    int y=0;  
    SqQueue sq =initQueue();  
    enQueue(&sq,1);  
    enQueue(&sq,2);  
    enQueue(&sq,3);  
    enQueue(&sq,4);  
    deQueue(&sq,&y);  
    printQueue(sq);  
    printf("當(dāng)前的front=%d\n",sq.front);  
    printf("當(dāng)前的rear=%d\n",sq.rear);  
      
}  
20170305131117687.png

鏈隊列

鏈隊列的結(jié)構(gòu):

20170305151137321.jpg

代碼:

//鏈隊列結(jié)點結(jié)構(gòu)  
typedef struct QNode{  
    int data;  
    struct QNode *next;  
}QNode;  
//鏈隊列結(jié)構(gòu)  
typedef struct LiQueue{  
    QNode *front;  
    QNode *rear;  
}LiQueue;  

鏈隊列的狀態(tài)

(1)隊空

lq->front==NULL || lq->rear==NULL

鏈隊列的操作

(1)進(jìn)隊列

lq->rear->next=p;  
lq->rear=p;

(2)出隊列

p=lq->front;  
lq->front=p->next;  
x=p->data;  
free(p); 

鏈隊列的實現(xiàn)

#include<stdio.h>  
#include<stdlib.h>  
//鏈隊列結(jié)點結(jié)構(gòu)  
typedef struct QNode{  
    int data;  
    struct QNode *next;  
}QNode;  
//鏈隊列結(jié)構(gòu)  
typedef struct LiQueue{  
    QNode *front;  
    QNode *rear;  
}LiQueue;  
//創(chuàng)建鏈隊列  
LiQueue initQueue(){  
    LiQueue *lq=(LiQueue *)malloc(sizeof(LiQueue));  
    if(lq ==NULL){  
        return;  
    }  
    lq->front=lq->rear=NULL;  
    return *lq;  
}  
//判斷鏈隊列是否為空  
int isEmpty(LiQueue *lq){  
    if(lq->front==NULL || lq->rear==NULL){  
        return 0;  
    }else{  
        return 1;  
    }  
}  
//元素進(jìn)鏈隊列  
void enQueue(LiQueue *lq,int x){  
    QNode *p;  
    p=(QNode *)malloc(sizeof(QNode));  
    p->data=x;  
    p->next=NULL;  
    if(lq->rear==NULL){  
        lq->front=lq->rear=p;//如果第一次插入則設(shè)置頭指針和尾指針為p  
    }else{  
        lq->rear->next=p;//鏈隊列的尾部插入p  
        lq->rear=p;//設(shè)置鏈隊列的尾指針指向p  
    }  
}  
//元素出鏈隊列  
int deQueue(LiQueue *lq,int *y){  
    QNode *p=lq->front;  
    if(lq->rear==NULL || lq->front==NULL){  
        return 0;  
    }  
    if(lq->front==lq->rear){  
        lq->front=lq->rear=NULL;  
    }else{  
        lq->front=lq->front->next;  
    }  
    *y=p->data;  
    free(p);  
    return 1;  
}  
//打印鏈隊列  
void printQueue(LiQueue lq){  
    if(lq.front==NULL || lq.rear==NULL){  
        return;  
    }  
    while(lq.front!=NULL){  
        printf("%d\n",lq.front->data);  
        lq.front=lq.front->next;  
    }  
}  
void main(){  
    int y=0;  
    LiQueue lq=initQueue();  
    enQueue(&lq,1);  
    enQueue(&lq,2);  
    enQueue(&lq,3);  
    enQueue(&lq,4);  
    enQueue(&lq,5);  
    deQueue(&lq,&y);  
    printQueue(lq);  
    printf("出隊列元素=%d\n",y);  
}  
20170305151547136.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容