循环队列的数据结构。
struct CircularQueue {
ElemType a[MaxSize];
int front, rear;
};
这个结构体包含三个成员:
a
是一个ElemType
类型的数组,用于存储循环队列的元素。front
是一个整数,表示队列头部元素的前一个位置。rear
是一个整数,表示队列尾部元素的位置。
循环队列的循环是怎样实现的?
循环队列的循环是通过使用模运算实现的。在循环队列中,使用一个固定大小的数组和两个指针(通常称为“头”和“尾”)来表示队列的开始和结束。当头尾指针指向向量上界时,其加1操作的结果是指向向量的下界0。
当向队列添加元素时,会将元素放在尾指针指向的位置,并将尾指针向前移动一位。当尾指针到达数组的末尾时,会将其移动回数组的开始。
bool queueFull(CircularQueue Q) { return ((Q.rear + 1) % MaxSize == Q.front); }
Status queuePush(CircularQueue &Q, ElemType e) {
if (queueFull(Q)) {
return ERROR;
}
Q.a[Q.rear] = e;
Q.rear = (Q.rear + 1) % MaxSize;
return OK;
}
这可以通过对数组大小进行模运算来实现。
rear = (rear + 1) % MAX_SIZE;
同样,当从队列中删除元素时,会将头指针向前移动一位。如果头指针到达数组的末尾,也会将其移动回数组的开始。
bool queueEmpty(CircularQueue Q) { return (Q.front == Q.rear); }
Status queuePop(CircularQueue &Q) {
if (queueEmpty(Q)) {
return ERROR;
}
Q.front = (Q.front + 1) % MaxSize;
return OK;
}
这可以通过对数组大小进行模运算来实现。
front = (front + 1) % MAX_SIZE;
通过这种方式,可以使队列在数组中“循环”,即当队列填满数组后,可以从数组的开始重新开始填充,只要队列中还有空位。