원형 큐 애니메이션 데모 애니메이션으로 코드를 시각화하세요

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

什么是循环队列?

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

操作基于 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급