一、队列的基本概念
队列简称队,也是一种运算受限的线性表,其限制仅允许在表的一端进行插入,而在表的另一端进行删除,通常把进行插入的一端称为队尾(rear),进行删除的一端称作队首或对头(front)。
队列的主要特点是“先进先出”。
基本运算:
init(&q):初始化队列,构造一个空的队列q。
isEmpty(q):判断队列是否为空。
enQueue(&q,e):入队操作,将元素e作为队尾元素。
deQueue(&q,&e):出队运算,从队列中出队一个元素,赋值给e。
二、代码实现
1.顺序队
#include<stdio.h> #define MAXSIZE 50 typedef int elemType; typedef struct{ elemType data[MAXSIZE]; int front,rear; }SqQueue; void init(SqQueue &q){ q.front=q.rear=0; } bool isEmpty(SqQueue q){ return (q.front==q.rear); } int enQueue(SqQueue &q,elemType e){ if((q.rear+1)%MAXSIZE==q.front) return 0; q.rear=(q.rear+1)%MAXSIZE; q.data[q.rear]=e; return 1; } int deQueue(SqQueue &q,elemType &e){ if(q.front==q.rear) return 0; q.front=(q.front+1)%MAXSIZE; e=q.data[q.front]; return 1; } int main(){ SqQueue q; init(q); for(int i=1;i<=5;i++){ enQueue(q,i); } int x; while(!isEmpty(q)){ deQueue(q,x); printf("%d\n",x); } return 0; }
2.链队
#include<stdio.h> #include<stdlib.h> typedef int elemType; typedef struct qnode{ elemType data; struct qnode *next; }qnode; typedef struct { qnode *front; qnode *rear; }LiQueue; void init(LiQueue *&q){ q = (LiQueue*)malloc(sizeof(LiQueue)); q->front=q->rear=NULL; } int isEmpty(LiQueue *q){ return q->rear==NULL; } int enQueue(LiQueue *&q,elemType e){ qnode *node = (qnode*)malloc(sizeof(qnode)); node->data=e; node->next=NULL; if(q->rear==NULL){ q->rear=q->front=node; }else{ q->rear->next=node; q->rear=node; } return 1; } int deQueue(LiQueue *&q,elemType &e){ if(q->front==NULL) return 0; qnode *node = q->front; e = node->data; if(q->front==q->rear) q->front=q->rear=NULL; else q->front=q->front->next; free(node); return 1; } int main(){ LiQueue *q; init(q); for(int i=1;i<6;i++) enQueue(q,i); int x; for(int j=1;j<6;j++){ deQueue(q,x); printf("%d ",x); } return 0; }