Анимационная демонстрация циклической очереди Визуализируйте свой код с помощью анимации

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

什么是循环队列?

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

操作基于 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。 查看您的文章出现在 图码 主页上并帮助其他极客。 

Независимо от того, стремитесь ли вы к успеху на экзаменах, профессиональному развитию или просто из чистого интереса, этот сайт визуализации структур данных и алгоритмов станет бесценным ресурсом.

Перейдите на этот сайт и начните свое учебное путешествие!

Вот распространенные: [Описание на C] «Структуры данных и алгоритмы» Реализация структур данных на JAVA Основы структур данных и алгоритмов (Циндаоский университет - Ван Чжо) Структуры данных и алгоритмы Структуры данных Ван Дао Реализация структур данных на C Ускоренный курс структур данных для подготовки к финальному экзамену Видеоурок по структурам данных на C Версия учебника Структуры данных Янь Вэйминь Структуры данных Хао Бин Структуры данных для вступительных экзаменов в аспирантуру Структуры данных JAVA Алгоритмы и основы Структуры данных Ван Дао 2022 Изучение структур данных Структуры данных Маленькая черепаха Ван Чжо Изучение структур данных Структуры данных Чжэцзянский университет Повторение структур данных Структуры данных Ма Шибин Учебник по структурам данных с нуля Структуры данных и алгоритмы Введение в структуры данных Объяснение задач по структурам данных для вступительных экзаменов в аспирантуру Повторение структур данных к финальному экзамену Компьютерный уровень 2