Demostración animada de cola circular Visualiza tu código con animaciones

图码-数据结构可视化动画版

什么是循环队列?

循环队列是 普通队列 的扩展版本,其中队列的最后一个元素连接到队列的第一个元素形成一个循环。

操作基于 FIFO(先进先出)原则执行。 它也被称为 “环形缓冲区” 。 
 

循环队列

在普通队列中,我们可以插入元素直到队列满。 但是一旦队列满了,即使队列前面有空间,我们也无法插入下一个元素。

循环队列的操作:

  • Front: 从队列中获取最前面的项目。
  • 后部: 从队列中获取最后一项。
  • enQueue(value) 该函数用于向循环队列中插入一个元素。 在循环队列中,新元素总是插入到最后位置。 
    • 检查队列是否已满——【即循环地后端正好在前端之前】。
    • 如果已满则显示队列已满。 
      • 如果队列未满,则在队列末尾插入一个元素。
  • deQueue() 该函数用于从循环队列中删除一个元素。 在循环队列中,总是从最前面的位置删除元素。 
    • 检查队列是否为空。
    • 如果为空则显示队列为空。
      • 如果队列不为空,则获取最后一个元素并将其从队列中删除。

循环队列操作说明:

按照下图可以更好地理解入队和出队操作。

循环队列操作的工作原理

循环队列操作的工作原理

如何实现循环队列?

循环队列可以使用两种数据结构来实现:

  • 大批
  • 链表

这里我们展示了使用数组数据结构的循环队列的实现。

使用数组实现循环队列:

  1. 初始化一个大小为n 的数组队列 ,其中 n 是队列可以容纳的最大元素数。
  2. 将front和rear两个变量初始化为-1。
  3. 入队: 要将元素 x 入队,请执行以下操作:
    • 后面加 1。
      • 如果 后部 等于n,则将 后部 设置为0。
    • 如果 front 为 -1,则将 front 设置为 0。
    • 将队列[rear]设置为x。
  4. 出队: 要将元素从队列中出队,请执行以下操作:
    • 通过检查front 是否为 -1 来检查队列是否为空 。 
      • 如果是,则返回错误消息,指示队列为空。
    • x 设置为队列[front]。
    • 如果 front 等于 back ,则将 front back 设置为 -1。
    • 否则,将 front 加 1,如果 front 等于 n,则将 front 设置为 0。
    • 返回x。

下面是上述想法的实现:

C++

// C or C++ program for insertion and
// deletion in Circular Queue
#include<bits/stdc++.h>
using namespace std;
 
class Queue
{
    // Initialize front and rear
    int rear, front;
 
    // Circular Queue
    int size;
    int *arr;
public:
    Queue(int s)
    {
       front = rear = -1;
       size = s;
       arr = new int[s];
    }
 
    void enQueue(int value);
    int deQueue();
    void displayQueue();
};
 
 
/* Function to create Circular queue */
void Queue::enQueue(int value)
{
    if ((front == 0 && rear == size-1) ||
            ((rear+1) % size == front))
    {
        printf("\nQueue is Full");
        return;
    }
 
    else if (front == -1) /* Insert First Element */
    {
        front = rear = 0;
        arr[rear] = value;
    }
 
    else if (rear == size-1 && front != 0)
    {
        rear = 0;
        arr[rear] = value;
    }
 
    else
    {
        rear++;
        arr[rear] = value;
    }
}
 
// Function to delete element from Circular Queue
int Queue::deQueue()
{
    if (front == -1)
    {
        printf("\nQueue is Empty");
        return INT_MIN;
    }
 
    int data = arr[front];
    arr[front] = -1;
    if (front == rear)
    {
        front = -1;
        rear = -1;
    }
    else if (front == size-1)
        front = 0;
    else
        front++;
 
    return data;
}
 
// Function displaying the elements
// of Circular Queue
void Queue::displayQueue()
{
    if (front == -1)
    {
        printf("\nQueue is Empty");
        return;
    }
    printf("\nElements in Circular Queue are: ");
    if (rear >= front)
    {
        for (int i = front; i <= rear; i++)
            printf("%d ",arr[i]);
    }
    else
    {
        for (int i = front; i < size; i++)
            printf("%d ", arr[i]);
 
        for (int i = 0; i <= rear; i++)
            printf("%d ", arr[i]);
    }
}
 
/* Driver of the program */
int main()
{
    Queue q(5);
 
    // Inserting elements in Circular Queue
    q.enQueue(14);
    q.enQueue(22);
    q.enQueue(13);
    q.enQueue(-6);
 
    // Display elements present in Circular Queue
    q.displayQueue();
 
    // Deleting elements from Circular Queue
    printf("\nDeleted value = %d", q.deQueue());
    printf("\nDeleted value = %d", q.deQueue());
 
    q.displayQueue();
 
    q.enQueue(9);
    q.enQueue(20);
    q.enQueue(5);
 
    q.displayQueue();
 
    q.enQueue(20);
    return 0;
}


            

Java

C#

蟒蛇3

JavaScript

输出

循环队列中的元素为:14 22 13 -6
删除的值 = 14
删除值 = 22
循环队列中的元素为:13 -6
循环队列中的元素为: 13 -6 9 20 5
队列已满

循环队列操作的复杂度分析:

  • 时间复杂度:  
    • 入队:O(1),因为单个入队不涉及循环。
    • 出队:O(1),因为一次出队操作不涉及循环。
  • 辅助空间: O(N),因为队列大小为 N。

循环队列的应用:

  1. 内存管理: 普通队列中未使用的内存位置可以在循环队列中利用。
  2. 交通系统: 在计算机控制的交通系统中,采用循环队列,按照设定的时间一一重复地打开交通灯。
  3. CPU 调度: 操作系统通常维护一个准备执行或等待特定事件发生的进程队列。

如果您喜欢 图码 并愿意做出贡献,您还可以使用 write.geeksforgeeks.org 撰写文章或将您的文章邮寄至 review-team@geeksforgeeks.org。 查看您的文章出现在 图码 主页上并帮助其他极客。 

Ya sea que tu objetivo sea aprobar exámenes, avanzar en tu carrera o simplemente por interés puro, este sitio web de visualización de estructuras de datos y algoritmos será un recurso invaluable.

¡Visita este sitio web y comienza tu viaje de aprendizaje!

Estos son comunes: [Descripción en C] Estructuras de datos y algoritmos Implementación en JAVA de estructuras de datos Fundamentos de estructuras de datos y algoritmos (Universidad de Qingdao - Wang Zhuo) Estructuras de datos y algoritmos Estructuras de datos de Wang Dao Implementación en C de estructuras de datos Curso intensivo de estructuras de datos para salvar el examen final Tutorial en video de estructuras de datos en C Yan Weimin de estructuras de datos Hao Bin de estructuras de datos Examen de posgrado en estructuras de datos Algoritmos y fundamentos de estructuras de datos en JAVA Estructuras de datos de Wang Dao 2022 Aprendizaje de estructuras de datos Pequeña tortuga de estructuras de datos Wang Zhuo Aprendizaje de estructuras de datos Estructuras de datos de la Universidad de Zhejiang Repaso de estructuras de datos Soldado Ma de estructuras de datos Tutorial básico de estructuras de datos Estructuras de datos y algoritmos Introducción a estructuras de datos Explicación de ejercicios de estructuras de datos para examen de posgrado Repaso final de estructuras de datos Nivel 2 de informática