循环队列类型模块说明:
// ----- 循环队列——队列的顺序存储结构 -----
# define MAXQSIZE 100 // 最大队列长度
typedef struct {
QElemType *base; // 初始化的动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的下一个元素
} SqQueue;
// ----- 循环队列的基本操作的算法描述 -----
Status InitQueue (SqQueue &Q) {
// 构造一个空队列Q
Q.base = (QElemType *) malloc (MAXQSIZE * sizeof (QElemType));
if (!Q.base) exit (OVERFLOW); // 存储分配失败
Q.front = Q.rear = 0;
return OK;
}
int QueueLength (SqQueue Q) {
// 返回Q的元素个数,即队列的长度
return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}
Status EnQueue (SqQueue &Q, QElemType e) {
// 插入元素e为Q的新的队尾元素
if ((Q.rear + 1) % MAXQSIZE == Q.front) return ERROR; // 队列满
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXQSIZE;
return OK;
}
Status DeQueue (SqQueue &Q, QElemType &e) {
// 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
if (Q.front == Q.rear) return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXQSIZE;
return OK;
}
由于只凭等式 Q.front = Q.rear 无法判断队列空间是"空“还是“满”,因此,少用一个元素空间,约定以“对队列头指针在队列尾指针的下一位置(指环状的下一位置)上”作为队列呈“满”状态的标志。
循环队列需要为它设定一个最大队列长度,若用户无法预估所用队列的最大长度,则宜采用链队列。