正在载入交互式动画窗口请稍等
队列-顺序表-循环队列 可视化交互式动画版
什么是循环队列?
循环队列是 普通队列 的扩展版本,其中队列的最后一个元素连接到队列的第一个元素形成一个循环。
操作基于 FIFO(先进先出)原则执行。
它也被称为
“环形缓冲区”
。
在普通队列中,我们可以插入元素直到队列满。 但是一旦队列满了,即使队列前面有空间,我们也无法插入下一个元素。
循环队列的操作:
- Front: 从队列中获取最前面的项目。
- 后部: 从队列中获取最后一项。
-
enQueue(value)
该函数用于向循环队列中插入一个元素。
在循环队列中,新元素总是插入到最后位置。
- 检查队列是否已满——【即循环地后端正好在前端之前】。
-
如果已满则显示队列已满。
- 如果队列未满,则在队列末尾插入一个元素。
-
deQueue()
该函数用于从循环队列中删除一个元素。
在循环队列中,总是从最前面的位置删除元素。
- 检查队列是否为空。
-
如果为空则显示队列为空。
- 如果队列不为空,则获取最后一个元素并将其从队列中删除。
循环队列操作说明:
按照下图可以更好地理解入队和出队操作。
如何实现循环队列?
循环队列可以使用两种数据结构来实现:
- 大批
- 链表
这里我们展示了使用数组数据结构的循环队列的实现。
使用数组实现循环队列:
- 初始化一个大小为n 的数组队列 ,其中 n 是队列可以容纳的最大元素数。
- 将front和rear两个变量初始化为-1。
-
入队:
要将元素
x
入队,请执行以下操作:
-
后面加 1。
- 如果 后部 等于n,则将 后部 设置为0。
- 如果 front 为 -1,则将 front 设置为 0。
- 将队列[rear]设置为x。
-
后面加 1。
-
出队:
要将元素从队列中出队,请执行以下操作:
-
通过检查front
是否为 -1 来检查队列是否为空
。
- 如果是,则返回错误消息,指示队列为空。
- 将 x 设置为队列[front]。
- 如果 front 等于 back ,则将 front 和 back 设置为 -1。
- 否则,将 front 加 1,如果 front 等于 n,则将 front 设置为 0。
- 返回x。
-
通过检查front
是否为 -1 来检查队列是否为空
。
下面是上述想法的实现:
- C++
- Java
- C#
- 蟒蛇3
- JavaScript
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。
循环队列的应用:
- 内存管理: 普通队列中未使用的内存位置可以在循环队列中利用。
- 交通系统: 在计算机控制的交通系统中,采用循环队列,按照设定的时间一一重复地打开交通灯。
- CPU 调度: 操作系统通常维护一个准备执行或等待特定事件发生的进程队列。
如果您喜欢 图码 并愿意做出贡献,您还可以使用 write.geeksforgeeks.org 撰写文章或将您的文章邮寄至 review-team@geeksforgeeks.org。 查看您的文章出现在 图码 主页上并帮助其他极客。