循环队列的顺序存储结构如下:
/* */
typedef int QElemType;
/* 循环队列的顺序存储结构 */
typedef struct
{
QElemType data[MAXSIZE];
int front; //头指针
int rear; //尾指针
}SqQueue;
循环队列的初始化代码如下:
/* 初始化一个空队列 Q*/
Status InitQueue( SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
return OK;
}
循环队列求队列长度代码如下:
/* 返回Q的元素个数,也是队列的当前长度 */
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
循环队列的入队列操作如下:
/* 若队列未满,则插入元素e为Q新的队尾元素 */
Status EnQueue(SqQueue *Q, QElemType e)
{
if((Q->rear+1)%MAXSIZE == Q->front) /* 队列满的判断 */
return ERROR;
Q->data[Q->rear] = e; //将元素e赋值给队尾
Q->rear = (Q->rear+1)%MAXSIZE; //队尾指针向后移一位
return OK;
}
循环队列的出队列操作如下:
/* 若队列不空,则删除Q中队头元素,用e值返回 */
Stauts DeQueue(SqQueue *Q, QElemType *e)
{
if(Q->front == Q->rear) //队列空的判断
return ERROR;
*e = Q->data[Q->front]; //将队头元素赋值给e
Q->front = (Q->front+1) %MAXSIZE; //front指针后移一位,若到最后则转到数组头部
return OK;
}