循环队列:
图示为理想结构:
数组形式的循环队列实际上仍是同普通数组 一样的结构。只不过是运用%运算,进行了逻辑上的循环。
而链式的循环队列,其实就是循环链表,只不过是只能在队头进行操作(队头入、出队)。
循序队列实际存储大小会比maxSize小1
记录数组形式实现:
#define Cirque_Size 20
typedef int elemType;
class Cirque {
public:
elemType* elements;
int head; // 头
int tail; // 尾
int maxSize; // 队列大小
public:
bool Push(elemType e); // 入队
bool Pop(); // 出队
elemType getfront(); // 获取队头元素
bool Is_empty(); // 是否空
bool Is_full(); // 是否满
Cirque(int size = Cirque_Size) :head(0), tail(0), maxSize(size) {
elements = new elemType[maxSize];
}
};
是否为空:
// 是否为空
bool Cirque::Is_empty() {
if (head == tail) {
return true;
}
return false;
}
是否为满:
// 是否满
bool Cirque::Is_full() {
if ((tail + 1) % maxSize == head) {
return true;
}
return false;
}
入队:
// 入队
bool Cirque::Push(elemType e) {
// 队列已满(实际上会浪费一个内存空间)
if (this->Is_full()) {
return false;
}
elements[tail] = e;
tail = (tail + 1) % maxSize; // 队尾后移
return true;
}
出队:
// 出队
bool Cirque::Pop() {
if (this->Is_empty()) { // 空
return false;
}
head = (head + 1) % maxSize; // 队头后移
return true;
}
获取队头元素:
// 获取队头元素
elemType Cirque::gethead() {
// 队空抛出断言
assert(head != tail);
return elements[head];
}
小结:
循环队列只不过是收到操作限制的循环链表。