1 队的定义
1.1 队
只允许在一端进行插入,在另一端进行删除的操作的线性表,又称为先进先出(First In First Out)线性表,简称FIFO
1.2 队的相关概念
队头:允许进行删除操作的一端
队尾:允许进行插入操作的一端
空队:不含任何数据元素的队
1.3 队的操作
入队:在队尾添加一个元素
出队:在对头删除一个元素
2 队的抽象数据类型
ADT队:
Data:
a1,a2,a3,...,ai-1,ai,ai+1,...,an
Operation initQueue(Q) //初始化操作建立一个空队 DestroyQueue(Q) //销毁一个已存在的队 ClearQueue(Q) //清空一个队 QueueEmpty(Q) //若队为空,返回true //若队不为空,返回false GetQueue(Q,e) //若队存在且为空,返回队首元素 EnQueue(Q,e) //若队列存在,在队尾插入一个元素 DeQueue(Q,e) //若队存在且为空,返回并删除队首元素 QueueLength(Q) //返回队列中元素个数 endADT
3 队的顺序存储结构
3.1 队的顺序存储结构的缺点
出队效率低下
出队时浪费存储空间,入队时存储空间不足
3.2 循环队列
将队列首尾相接的存储结构
3.3 队的存储结构
#define QUEUESIZE 100 typedef int DataType typedef struct //结构体别名可有可无 { DataType data[QUEUESIZE]; int front; int rear; }SeqQueue;
3.4 队的初始化操作
#define QUEUESIZE 100 typedef int DataType typedef struct { DataType data[QUEUESIZE]; int front; int rear; }SeqQueue; void initQueue(SeqQueue *q) { q->front=0; q->rear=0; } void main() { SeqQueue sq; initQueue(&sq); }
3.5 删除队中所有元素
void ClearQueue(SeqQueue *q) { q->front=0; q->rear=0; }
3.6 判断队是否为空
#define QUEUESIZE 100 typedef int DataType typedef struct { DataType data[QUEUESIZE]; int front; int rear; }SeqQueue; void initQueue(SeqQueue *q) { q->front=0; q->rear=0; } bool QueueEmpty(SeqQueue *q) { return q->front=q->rear; } void main() { SeqQueue sq; initQueue(&sq); if(QueueEmpty(&sq)) printf("Queue is empty"); else printf("Queue is not empty"); }
3.7 判断队是否为满
bool QueueFull(SeqQueue *q) { return q->front = (q->rear+1)%QUEUESIZE; }
3.8 获取队头元素
bool getQueue(SeqQueue *q,DataType *e) { if(QueueEmpty(&q)) return ERROR; *e=q->data[q->front]; return OK; }
3.9 从队列中取出一个元素
Status DeQueue(SeqQueue *q,DataType *e) { if(QueueEmpty(q)) return ERROR; *e=q->data[q->front]; q->front=(q->front+1)%QUEUESIZE; return OK; }
3.10 队列中添加一个元素
Status EnQueue(SeqQueue *q,DataType e) { if(QueueEmpty(q)) return ERROR; q->data[q->rear]=e; q->rear=(q->rear+1)%QUEUSIZE; return OK; }
3.11 求队列的长度
int QueueLength(SeqQueue *q) { return (q->rear-q->front+QUEUESIZE)%QUEUESIZE; }
4 队的链式存储结构
4.1 队的链式存储结构
typedef int DataType; typedef struct Qnode { DataType data; struct Qnode *next; }Qnode; typedef struct { Qnode *front,*rear; DataType count; }LinkQueue;
4.2 队的链式存储结构的初始化操作
void InitQueue(LinkQueue *q) { if(QueueEmpty(q)==false) ClearQueue(q); else q->front=q->rear=NULL; q->count=0; } void main() { LinkQueue lq; lq.front=NULL; //如果没有这一句,程序可能崩溃;不为空可能随机赋值,即野指针 InitQueue(&lq); }
4.3 队列中添加一个元素
void EnQueue(LinkQueue *q) { Qnode *p=(Qnode *)malloc(sizeof(Qnode)); p->data=e; p->next=NULL; if(QueueEmpty(q)) q->front=q->rear=NULL; else { q->rear->next=p; q->rear=p; } q->count++; }
4.4 将队列中所有元素删除
void ClearQueue(LinkQueue *q) { Qnode *p=q->front; while(p) { Qnode *p1=p; p=p->next; free(p1); } q->front=q->rear=NULL; q->count=0; }
4.5 判断队是否为空
bool QueueEmpty(LinkQueue *q) { return q->front=NULL; }
4.6 求队的长度
bool QueueLength(LinkQueue *q) { return q->count; }
LinkQueue lq={}; 相当于:lq.front=0;lq.rear=0;lq.count=0;
4.7 获取队头元素
Status getHead(LinkQueue *q,DataType *e) { if(QueueEmpty(q)) return ERROR; *e=q->front->data; return OK; }
4.8 队列中取出一个元素
Status DeQueue(LinkQueue *q,DataType *e) { if(QueueEmpty(q)) return ERROR; Qnode *p=q->front; *e=q->front->data; q->front=q->front->next; free(q); q->count--; return OK; }