循环队列的结构体定义
typedef int Status;
typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */
/* 循环队列的顺序存储结构 */
typedef struct QNode
{
QElemType data[MAXSIZE];
int front; /* 头指针 */
int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}SqQueue;
(2)生成空队列
/* 初始化一个空队列Q */
Status CreateQueue(SqQueue *Q)
{
SqQueue *Q = (SqQueue)malloc(sizeof(struct QNode));
Q->data = (ElementType*)malloc(MaxSize * sizeof(ElementType));
Q->front = Q->rear = 0;
return OK;
}
队空的条件是:rear=front
bool IsEmpty(SqQueue *Q)
{
return(Q->front == Q->rear);
}
队满的条件是:(rear+1)%数组的长度等于 front
bool IsFull(SqQueue *Q)
{
return((Q->rear+1)% MaxSize == Q->front);
}
(5)入队
/* 若队列未满,则插入元素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;/* rear指针向后移一位置, */
/* 若到最后则转到数组头部 */
return OK;
}
(6)出队
/* 若队列不空,则删除Q中队头元素,用e返回其值 */
Status 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;
}