【Linux C编程】第二十七章 如何在 C 中实现循环队列?
C 中的循环队列以非常实用的方式存储数据。它是一种线性数据结构。它与队列非常相似。唯一的区别是最后一个节点连接回第一个节点。因此,它被称为循环队列。本文将帮助您详细探索这个概念。
本文将介绍以下指针,
C中的循环队列
循环队列解决了普通队列的局限性。 从而使其成为比普通队列更好的选择。它还遵循先到先服务算法。循环队列也称为环形缓冲区。
循环队列上的操作
- 入队 - 如果队列中有空间,则在队列中添加一个元素。
- Dequeue - 如果队列中有任何元素,则从队列中删除元素
- Front- 从队列中获取第一项。
- 重新获取队列中的最后一项。
- isEmpty/isFull- 检查队列是空还是满。
循环队列的应用
- 内存管理:循环队列用于内存管理。
- 进程调度:CPU 使用队列来调度进程。
- 交通系统:队列也用于交通系统。
示例代码
#include<stdio.h>
# define MAX 5
int cqueue_arr[MAX];
int front = -1;
int rear = -1;
void insert(int item)
{
if((front == 0 && rear == MAX-1) || (front == rear+1))
{
printf("Queue Overflow n");
return;
}
if(front == -1)
{
front = 0;
rear = 0;
}
else
{
if(rear == MAX-1)
rear = 0;
else
rear = rear+1;
}
cqueue_arr[rear] = item ;
}
void deletion()
{
if(front == -1)
{
printf("Queue Underflown");
return ;
}
printf("Element deleted from queue is : %dn",cqueue_arr[front]);
if(front == rear)
{
front = -1;
rear=-1;
}
else
{
if(front == MAX-1)
front = 0;
else
front = front+1;
}
}
void display()
{
int front_pos = front,rear_pos = rear;
if(front == -1)
{
printf("Queue is emptyn");
return;
}
printf("Queue elements :n");
if( front_pos <= rear_pos )
while(front_pos <= rear_pos)
{
printf("%d ",cqueue_arr[front_pos]);
front_pos++;
}
else
{
while(front_pos <= MAX-1)
{
printf("%d ",cqueue_arr[front_pos])
front_pos++;
}
front_pos = 0;
while(front_pos <= rear_pos)
{
printf("%d ",cqueue_arr[front_pos]);
front_pos++;
}
}
printf("n");
}
int main()
{
int choice,item;
do
{
printf("1.Insertn");
printf("2.Deleten");
printf("3.Displayn");
printf("4.Quitn");
printf("Enter your choice : ");
scanf("%d",&choice);
switch(choice)
{
case 1 :
printf("Input the element for insertion in queue : ");
scanf("%d", &item);
insert(item);
break;
case 2 :
deletion();
break;
case 3:
display();
break;
case 4:
break;
default:
printf("Wrong choicen");
}
}while(choice!=4);
return 0;
}
Output:
Explanation
此代码是循环队列的菜单驱动实现。首先,定义 MAX 变量的大小为 5。然后,声明名为 cqueue_array 的数组的大小为 MAX。需要声明三个函数。功能是插入、显示和删除功能。有一个菜单驱动的主要功能。要求用户输入他的选择并调用适当的函数来执行任务。
有2个指针,前面在队列的前面,后面在队列的后面。在循环队列中,元素从队列后面添加,从队列前面删除。这是循环队列,所以如果后部在最后一个位置,如果增加它将指向第一个元素
继续这篇关于 C 中的循环队列的文章
插入功能
void insert(int item)
{
if((front == 0 && rear == MAX-1) || (front == rear+1))
{
printf("Queue Overflow n");
return;
}
if(front == -1)
{
front = 0;
rear = 0;
}
else
{
if(rear == MAX-1)
rear = 0;
else
rear = rear+1;
}
cqueue_arr[rear] = item ;
}
在插入部分,检查循环队列是否已满,如果是则给出溢出消息,否则检查循环队列是否为空。如果后部位于最后一个位置,则将其指向第一个位置,否则后部将加一。这就是它变成循环队列的方式。最后,项目进入队列。
继续这篇关于 C 中的循环队列的文章
删除功能
void deletion()
{
if(front == -1)
{
printf("Queue Underflown");
return;
}
printf("Element deleted from queue is : %dn",cqueue_arr[front]);
if(front == rear)
{
front = -1;
rear=-1;
}
else
{
if(front == MAX-1)
front = 0;
else
front = front+1;
}
}
在删除部分,首先检查循环队列是否为空。如果是,则打印下溢错误,即队列为空。否则打印第一个元素,即将被删除并增加前面的元素。这就是删除发生的方式。
然后,检查前后是否指向同一位置并将两个值都分配为 -1,即不指向任何地方。否则,检查前端是否在末尾,如果是,则使其指向第一个位置。否则,增加前面。
继续这篇关于 C 中的循环队列的文章
Display Function
void display()
{
int front_pos = front,rear_pos = rear;
if(front == -1)
{
printf("Queue is emptyn");
return;
}
printf("Queue elements :n");
if( front_pos <= rear_pos )
while(front_pos <= rear_pos)
{
printf("%d ",cqueue_arr[front_pos]);
front_pos++;
}
else
{
while(front_pos <= MAX-1)
{
printf("%d ",cqueue_arr[front_pos]);
front_pos++;
}
front_pos = 0;
while(front_pos <= rear_pos)
{
printf("%d ",cqueue_arr[front_pos]);
front_pos++;
}
}
printf("n");
}
我们只是像显示数组一样显示循环队列。检查循环队列是否也在这里为空。然后,根据变量front和rear的位置打印循环队列的元素。
这篇关于 C 中的循环队列的文章到此结束。
- 点赞
- 收藏
- 关注作者
评论(0)