初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。因此,在非空队列中,头指针指向队列头元素,而尾指针始终指向队尾元素的下一个位置。
将顺序队列臆造为一个环状的空间。
循环队列的基本操作:
#define MAXQSIZE 100
typedef int Status;
typedef int Boolean;
typedef int QElemType;
typedef struct{
QElemType *base;//初始化的动态分配存储空间
QueuePtr front;//对头指针
QueuePtr rear;//队尾指针
}SqQueue;
//构造一个空队列Q
Status InitQueue(LinkQueue &Q){
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base) exit (OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
//插入元素e为Q的新的队尾元素
Status EnQueue(LinkQueue &Q,QElemType e){
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;//队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
//若队列不空,则删除Q的对头元素,用e返回其值
Status DeQueue(LinkQueue &Q,QElemType e){
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
//返回Q的元素个数,即队列的长度
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}