Animierte Darstellung einer Ringwarteschlange Visualisiere deinen Code mit Animationen

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

什么是循环队列?

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

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

Egal, ob dein Ziel der Erfolg in Prüfungen, die berufliche Entwicklung oder reines Interesse ist – diese Website zur Visualisierung von Datenstrukturen und Algorithmen wird eine unschätzbare Ressource sein.

Besuche diese Website und beginne deine Lernreise!

Diese sind üblich: 【Beschreibung in C】Datenstrukturen und Algorithmen, JAVA-Implementierung von Datenstrukturen, Grundlagen von Datenstrukturen und Algorithmen (Qingdao-Universität – Wang Zhuo), Datenstrukturen und Algorithmen, Wang-Dao-Datenstrukturen in C-Sprache implementiert, Schnellkurs für Datenstrukturen, Notfallrettung vor der Abschlussprüfung für Datenstrukturen, Video-Tutorial für Datenstrukturen in C-Sprache, Yan Weimin Datenstrukturen, Hao Bin Datenstrukturen, Datenstrukturen für die Aufnahmeprüfung, JAVA-Datenstrukturen, Algorithmen und Grundlagen, Wang Dao Datenstrukturen 2022, Datenstrukturen lernen, Kleiner Fisch Datenstrukturen, Wang Zhuo, Datenstrukturen lernen, Zhejiang-Universität Datenstrukturen, Datenstrukturen wiederholen, Ma Shibing Datenstrukturen, Null-Grundlagen-Tutorial für Datenstrukturen, Datenstrukturen und Algorithmen, Einführung in Datenstrukturen, Übungen zu Datenstrukturen für die Aufnahmeprüfung, Abschlussprüfung für Datenstrukturen wiederholen, Computer-Level-2