C中的循环队列:如何实现?

已发表: 2020-10-23

数据以循环模式排列在循环队列中,其中最后一个元素连接到第一个元素。 与任务在 FIFO(先进先出)上执行的线性队列不同,任务执行的循环队列顺序可能会发生变化。 插入和删除操作可以在任何位置进行。

循环队列比线性队列更有效。 在循环队列的图形表示中,您可以观察到前后位置是相连的,形成一个循环,其中操作始终以 FIFO 为基础执行。 每个新元素都在后端添加并从前端删除。 循环队列的利用率更高,时间复杂度为 O(1)。

资源

目录

循环队列的应用

  • CPU 调度:循环队列利用线性队列中的空内存空间。
  • 交通系统:在交通系统中,借助循环队列,交通信号灯以设定的时间间隔运行。
  • 内存管理:操作系统经常保持一系列准备执行或等待特定事件发生的进程。

学习:用于冒泡排序的 C 程序:C 中的冒泡排序

带说明的示例代码

第 1 行:// (1) 预处理器

第 2 行:// 将队列限制设置为 5 个元素

第 3 行:#include<stdio.h>

第 4 行:#define LIM 5

第 5 行:// (2) 队列数据类型声明

第 6 行:// 数据保存数据; delPos,要删除的位置; 长度,没有。

第 7 行:// 队列中当前存在的元素

第 8 行:typedef struct queue {

第9行:int data[LIM]、delPos、length;

第 10 行: } Q;

第 11 行:// (3) 全局声明

第 12 行:// struct queue 类型的函数和全局变量 q

第 13 行:Q q;

第 14 行:void ui_Q_Ops()、insertQel()、deleteQel()、displayQels()、initQ();

第 15 行:// (4) 初始化后调用 UI Function

第 16 行:int main()

第 17 行:{

第 18 行:initQ();

第 19 行:ui_Q_Ops();

第20行:返回0;

第 21 行:}

第 22 行:// (5) 初始化队列

第 23 行:void initQ()

第 24 行:{

第 25 行:q.length = 0;

第 26 行:q.delPos = 0;

第 27 行:}

第 28 行:// (6) 菜单驱动循环调用正确的函数

第 29 行:void ui_Q_Ops()

第 30 行:{

第 31 行:int 选择=0;

第 32 行:字符输入[16];

第 33 行:while(choice!=4){

第 34 行: printf(" \n ——————-\n ");

第 35 行: printf(" 1. 插入队列 \n ");

第 36 行: printf(" 2. 从队列中删除 \n");

第 37 行: printf(" 3. 显示队列项 \n");

第 38 行: printf(" 4. 退出程序 \n");

第 39 行: printf(" 输入选择:");

第 40 行: if (fgets(input, 15, stdin) != NULL){

第 41 行: if (sscanf(input, “%d”, &choice) == 1){

第 42 行:开关(选择){

第 43 行:案例 1:insertQel();

第 44 行:中断;

第 45 行:案例 2:deleteQel();

第 46 行:中断;

第 47 行:案例 3:displayQels();

第 48 行:中断;

第 49 行:案例 4:返回;

第 50 行:默认值:printf(“无效选择\n”);

第 51 行:继续;

第 52 行:}

第 53 行:} 其他

第 54 行: printf(" 无效选择 \n");

第 55 行:}

第 56 行:}

第 57 行:}

第 58 行:// (7) 插入队列

第 59 行://如果长度等于 MAX 限制,则队列已满,否则插入

第 60 行:// 通过 MAX Limit 以总长度和 delPos 模数循环实现

第 61 行:// 并增加长度

第 62 行:void insertQel()

第 63 行:{

第64行:int el,inspos;

第 65 行:字符输入[16];

第 66 行:if (q.length == LIM){

第 67 行:printf("队列已满\n");

第 68 行:返回;

第 69 行:}

第 70 行:inspos = (q.delPos + q.length) % LIM;

第 71 行: printf(" 输入要插入的元素:");

第 72 行: if (fgets(input, 15, stdin) != NULL){

第 73 行:if (sscanf(input, “%d”, &el)){

第 74 行:q.data[inspos] = el;

第 75 行:q.length++;

第 76 行:} 其他

第 77 行: printf(" 无效输入 \n ");

第 78 行:}

第 79 行:}

第 80 行:// (8) 从队列中删除

第 81 行:// 如果 Length 为 0,则队列为空,否则在 delPos 处删除

第 82 行:// 并减少长度

第 83 行:无效 deleteQel()

第 84 行:{

第 85 行:如果 (q.length == 0){

第86行:printf("队列为空\n");

第 87 行:} 其他 {

第 88 行: printf(" 已删除元素 %d \n ", q.data[q.delPos]);

第 89 行:q.delPos = (q.delPos + 1) % LIM;

第 90 行:q.length–;

第 91 行:}

第 92 行:}

第 93 行:// (9) 显示队列元素

第 94 行:// 以循环方式显示从 delPos 开始运行一个循环

第 95 行:// 并通过 Max Limit 添加迭代器和模数

第 96 行:无效 displayQels()

第 97 行:{

第 98 行:int i;

第 99 行:如果 (q.length == 0){

第 100 行:printf("队列为空\n");

第 101 行:} 其他 {

第 102 行: printf(" 队列的元素是:");

第 103 行: for(i = 0; i < q.length; i++){

第 104 行: printf(“%d”, q.data[(q.delPos+i)%LIM]);

第 105 行:}

第 106 行: printf(" \n ");

第 107 行:}

第 108 行:}

第 109 行:

输出:

循环队列上的操作

1. insertQel() - 将元素插入循环队列

在循环队列中,enQueue() 函数用于将元素插入到循环队列中。 在循环队列中,新特征总是插入到后面的位置。 enQueue() 函数将一个整数值作为参数并将其插入到循环队列中。 执行以下步骤以将元素插入循环队列:

第 1 步 – 检查长度是否与 MAX Limit 相同。 如果为真,则表示队列已满。 如果是FULL,则显示“Queue is full”并终止函数。

第 2 步 – 如果它不完整,则插入通过 MAX Limit 和增量长度通过总和长度和 delPos 模数循环实现的值

2. deleteQel() - 从循环队列中删除一个元素

在循环队列中,deQueue() 是用于从循环队列中删除元素的函数。 在循环队列中,元素总是从最前面的位置删除。 deQueue() 函数不接受任何值作为参数。 执行以下步骤以从循环队列中删除元素……

步骤 1 – 检查队列是否为 EMPTY。 (前 == -1 && 后 == -1)

第 2 步 – 如果是 EMPTY,则显示“Queue is empty”并终止函数。

第 3 步 – 如果不是空的,则根据位置显示已删除的元素。 添加每个元素后,移动到下一个位置 mod 队列限制。

3. displayQels() – 显示存在于循环队列中的队列元素。 执行以下步骤来显示循环队列的元素:

步骤 1 – 检查队列是否为 EMPTY。

步骤 2 – 如果长度为 0,则为 EMPTY,然后显示“Queue is empty”并终止函数。

第 3 步 – 如果它不是 EMPTY,则定义一个整数变量“i”。

第 4 步 – 将 i 设置为 0。

第 5 步 – 同样,根据位置和增量值显示元素 (i++)。 重复相同的操作,直到 'i <q.length' 变为 FALSE。

循环队列也可以使用链表来实现。 以下是算法:

  • 入队算法:

if (FRONT == NULL) // 插入空队列

前=后=新节点

万一

别的

REAR -> next = newNode // 在最后一个元素之后插入

后=新节点

以其他方式结束

后 -> 下一个 = 前

结束排队

  • 出队算法:

if(FRONT == NULL) // 下溢条件

打印“队列下溢”

结束出队

万一

else if(FRONT == REAR) // 队列只包含一个节点

温度 = 前 -> 数据

免费(临时)

前面 = 前面 -> 下一个

后 -> 下一个 = 前

万一

else if (FRONT == N – 1) // 如果 FRONT 是最后一个节点

front = 0 // 将 FRONT 作为第一个节点

万一

结束出队

另请阅读: Python 与 C:完整的并排比较

结论

数据结构和算法非常重要,不仅在 C 编程中,而且在其他语言中也是如此。 它的价值是前所未有的,对于如此重要​​的主题,最好投资于由专家设计和指导的课程,这将为您的投资组合提供极好的增值。 upGrad 提供范围广泛的功能丰富的课程,不仅可以提高您的技能,还可以建立强大的基础知识支柱。

它由享有盛誉的 IIIT-B 设计,他们不仅提供优质的内容,而且使您成为强大网络的一部分,您将与在同一职业道路上发展的人以及行业专家建立联系每次都解决您的疑虑并支持您。

了解他们的心态和思维过程会对你有所帮助。 您在 upGrad 获得的独特之处之一是您可以选择 EMI 选项并轻松负担得起

我们希望您在执行这些 C 项目时有一个很好的学习机会。 如果您有兴趣了解更多信息并需要行业专家的指导,请查看 upGrad & IIIT Banglore 的全栈软件开发PG 文凭。

为未来的职业做准备

升级和 IIIT-BANGALORE 的 PG 文凭在全栈软件开发中
现在申请