📅  最后修改于: 2023-12-03 15:25:37.696000             🧑  作者: Mango
在计算机科学中,队列是一种抽象数据类型,它只允许在队列的一端(称为队尾)插入新的元素,而在另一端(称为队首)删除元素。由于它的特殊性质,队列被用来实现许多重要的算法,包括广度优先搜索和迪杰斯特拉算法。而循环队列,也是队列的一种实现方式。
循环队列顾名思义就是可以循环使用的队列,又叫做环形队列。通常,队列可以用数组或链表来实现。而循环队列的数组实现要比链表实现简单。
循环队列可以用数组来实现,同样地,数组实现循环队列也十分简单。我们可以定义一个数组来保存队列中所有的元素,再定义一个头指针和一个尾指针指向队列的头部和尾部,完成出队入队等操作。
下面是一个具体的循环队列的实现代码,忽略了异常情况的处理(如队列已满或已空):
#define MAXSIZE 10
class Queue {
private:
int data[MAXSIZE];
int front, rear;
public:
Queue() :front(0), rear(0) {} //构造函数
bool push(int x) {
if ((rear + 1) % MAXSIZE == front) return false; //队列已满
data[rear] = x;
rear = (rear + 1) % MAXSIZE;
return true;
}
bool pop() {
if (front == rear) return false; //队列已空
front = (front + 1) % MAXSIZE;
return true;
}
int front() {
return data[front];
}
};
在上面的代码中,我们定义了一个最大大小为 MAXSIZE 的数组 data,表示队列的所有元素。我们还定义了两个指针front和rear,分别指向队列的头部和尾部。
在push函数中,当rear=(rear+1)%MAXSIZE,表示队列已经满了,如果队列没有满,则将x加入队列尾部data[rear],并将rear指向下一个位置。在pop函数中,当front==rear,表示队列为空,如果队列不为空,则将front指向下一个位置。在front函数中,返回front所指向的位置的值。