📜  循环队列 | Set 1(介绍和数组实现)(1)

📅  最后修改于: 2023-12-03 15:25:37.696000             🧑  作者: Mango

循环队列 | Set 1(介绍和数组实现)

什么是循环队列?

在计算机科学中,队列是一种抽象数据类型,它只允许在队列的一端(称为队尾)插入新的元素,而在另一端(称为队首)删除元素。由于它的特殊性质,队列被用来实现许多重要的算法,包括广度优先搜索和迪杰斯特拉算法。而循环队列,也是队列的一种实现方式。

循环队列顾名思义就是可以循环使用的队列,又叫做环形队列。通常,队列可以用数组或链表来实现。而循环队列的数组实现要比链表实现简单。

数组实现循环队列

循环队列可以用数组来实现,同样地,数组实现循环队列也十分简单。我们可以定义一个数组来保存队列中所有的元素,再定义一个头指针和一个尾指针指向队列的头部和尾部,完成出队入队等操作。

循环队列的实现细节

下面是一个具体的循环队列的实现代码,忽略了异常情况的处理(如队列已满或已空):

#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所指向的位置的值。