正在载入交互式动画窗口请稍等

队列-顺序表-循环队列 可视化交互式动画版

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

什么是循环队列?

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

操作基于 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数据结构学习 数据结构小甲鱼 王卓 学习数据结构 数据结构浙江大学 数据结构复习 数据结构马士兵 数据结构零基础教程 数据结构和算法 数据结构入门 考研数据结构习题讲解 数据结构期末复习 计算机二级