队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为进队,从队列中删除元素的行为称为出队。
队列的特点是先进先出。举例:火车从山洞一端开进,从山洞另一端开出,车厢好比一个个元素,最先进入山洞的车厢先出,后进山洞的车厢后出。
代码:
typedef struct SQQueue{ int data[maxsize]; int front;//队首指针 int rear;//队尾指针}SqQueue;循环队列的状态:
(1)队空状态:
qu.front ==qu.rear(2)队满状态:(qu->rear+1)%maxsize ==qu->front循环队列的操作:
(1)进队列:
qu->rear=(qu->rear+1)%maxsize;qu->data[qu->rear]=x;(2)出队列:*y=qu->data[qu->front];qu->front=(qu->front+1)%maxsize;循环队列的实现:
#include<stdio.h>#include<stdlib.h>#define maxsize 50typedef struct SqQueue{ int data[maxsize]; int front;//队首指针 int rear;//队尾指针}SqQueue;//创建循环队列SqQueue initQueue(){ SqQueue *sq=(SqQueue *)malloc(sizeof(SqQueue)); if(sq ==NULL){ return; } sq->rear=sq->front=0; return *sq;}//判断循环队列是否为空int isEmpty(SqQueue qu){ return (qu.front ==qu.rear?1:0);}//元素进循环队列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;}//元素出循环队列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;}//打印循环队列int PRintQueue(SqQueue qu){ if(qu.rear ==qu.front){ return 0; } while(qu.rear !=qu.front){ qu.front=(qu.front+1)%maxsize; printf("当前队列值=%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("当前的front=%d/n",sq.front); printf("当前的rear=%d/n",sq.rear); }结果:
4.链队列
链队列的结构:
代码:
//链队列结点结构typedef struct QNode{ int data; struct QNode *next;}QNode;//链队列结构typedef struct LiQueue{ QNode *front; QNode *rear;}LiQueue;链队列的状态:
(1)队空
lq->front==NULL || lq->rear==NULL链队列的操作:
(1)进队列:
lq->rear->next=p;lq->rear=p;(2)出队列:p=lq->front;lq->front=p->next;x=p->data;free(p);链队列的实现:
#include<stdio.h>#include<stdlib.h>//链队列结点结构typedef struct QNode{ int data; struct QNode *next;}QNode;//链队列结构typedef struct LiQueue{ QNode *front; QNode *rear;}LiQueue;//创建链队列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; }}//元素进链队列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;//如果第一次插入则设置头指针和尾指针为p }else{ lq->rear->next=p;//链队列的尾部插入p lq->rear=p;//设置链队列的尾指针指向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);}结果:
新闻热点
疑难解答