队列是一种特殊的线性表。 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 不含元素的空表称为空队列。队列又称为先进先出(first in first out)的线性表。
1.顺序(循环)队列的实现
在实现之前先把需要使用到的库和头文件进行包含
所需的头文件queue.h已经在上方提供
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
1)构造一个空的队列
Status InitQueue_Q(SqQueue &Q){
//构造一个空的队列
Q.base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)
return ERROR;
Q.front = 0;
Q.rear = 0;
return OK;
}//InitQueue_Q
2)销毁队列
Status DestoryQueue_Q(SqQueue &Q){
//销毁队列
free(Q.base);
Q.base = NULL;
return OK;
}//DestoryQueue_Q
3)清空队列
Status ClearQueue_Q(SqQueue &Q){
//清空队列
Q.front = Q.rear;
return OK;
}//ClearQueue_Q
4)判断队列是否为空
Status QueueEmpty_Q(SqQueue &Q){
//判断是否为空
if(Q.front = Q.rear)
return TRUE;
else
return FALSE;
}//QueueEmty_Q
5)获取队列中元素的个数
Status QueueLength_Q(SqQueue Q){
//返回队列Q中元素的个数
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}//QueueLength_Q
6)取队列头元素
Status GetHead_Q(SqQueue Q,QElemType &e){
//取队列头元素,并用e返回,若队列为空返回ERROR,否则返回OK
if(Q.front = Q.rear)
return ERROR;
e = *(Q.base+Q.front);
}//GetHead_Q
7)插入元素到队尾
Status EnQueue_Q(SqQueue &Q,QElemType e){
//插入元素e为Q的新队尾元素,队列已满返回ERROR,否则返回OK
if((Q.rear+1)%MAXQSIZE == Q.front)
return ERROR;
*(Q.base+Q.rear) = e;
Q.rear = (Q.rear + 1)%MAXQSIZE;
return OK;
}//EnQueue_Q
8)删除队头元素
Status DeQueue_Q(SqQueue &Q,QElemType e){
//若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK
if(Q.front = Q.rear)
return ERROR;
e = *(Q.base+Q.front);
Q.front = (Q.front+1)%MAXQSIZE;
}//DeQueue_Q
9)调用visit()函数遍历队列
Status visit_display_Q(QElemType e){
//打印元素
printf("%d\n",e);
return OK;
}//visit_display_Q
Status QueueTraverse_Q(SqQueue Q,Status (*visit)(QElemType e)){
//从队头到队尾依次对队列Q中每个元素调用函数visit()。一旦visit失效,则操作失败
int p;
p = Q.front;
while(p != Q.rear)
{
if(!(*visit)(*(Q.base+p)))
return ERROR;
p = (p+1)%MAXQSIZE;
}
return OK;
}//QueueTreaverse_Q