当前位置:首页 > 科技  > 软件

C语言代码:用 C 语言实现一个循环队列

来源: 责编: 时间:2023-12-08 09:15:11 376观看
导读一、引言队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。在实际应用中,队列经常被用于实现各种功能,如缓冲、任务调度等。而循环队列则是一种特殊的队列,它可以通过循环使用数组空间来避免队列中元素的浪费。在本文

一、引言

队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。在实际应用中,队列经常被用于实现各种功能,如缓冲、任务调度等。而循环队列则是一种特殊的队列,它可以通过循环使用数组空间来避免队列中元素的浪费。在本文中,我们将使用C语言来实现一个循环队列,并通过代码和注释进行详细讲解。z0L28资讯网——每日最新资讯28at.com

z0L28资讯网——每日最新资讯28at.com

二、循环队列的定义

循环队列通常使用一个固定大小的数组和两个指针来实现。其中一个指针指向队头元素,另一个指针指向队尾元素的下一个位置。当队列为空时,两个指针指向同一个位置;当队列为满时,队尾指针指向队头指针的前一个位置。为了实现循环效果,我们需要对数组下标进行取模运算。z0L28资讯网——每日最新资讯28at.com

在C语言中,我们可以定义一个结构体来表示循环队列,如下所示:z0L28资讯网——每日最新资讯28at.com

#define MAXSIZE 10 // 定义队列的最大容量    typedef struct {      int data[MAXSIZE]; // 存储数据的数组      int front; // 队头指针      int rear; // 队尾指针  } CircularQueue;

三、循环队列的操作

(1) 初始化队列z0L28资讯网——每日最新资讯28at.com

在使用循环队列之前,我们需要对其进行初始化。初始化的过程就是将队头和队尾指针设置为同一个位置。代码如下:z0L28资讯网——每日最新资讯28at.com

void InitQueue(CircularQueue *Q) {      Q->front = Q->rear = 0; // 初始化队头和队尾指针  }

(2) 判断队列是否为空z0L28资讯网——每日最新资讯28at.com

判断队列是否为空的方法很简单,只需要检查队头和队尾指针是否相等即可。代码如下:z0L28资讯网——每日最新资讯28at.com

int IsEmpty(CircularQueue *Q) {      return Q->front == Q->rear; // 如果队头和队尾指针相等,则队列为空  }

(3) 判断队列是否已满z0L28资讯网——每日最新资讯28at.com

判断队列是否已满的方法也很简单,只需要检查队尾指针是否指向队头指针的前一个位置即可。代码如下:z0L28资讯网——每日最新资讯28at.com

int IsFull(CircularQueue *Q) {      return (Q->rear + 1) % MAXSIZE == Q->front; // 如果队尾指针的下一个位置是队头指针,则队列已满  }

(4) 入队操作z0L28资讯网——每日最新资讯28at.com

入队操作就是将一个新元素添加到队列的尾部。在实现入队操作时,我们需要先判断队列是否已满。如果队列已满,则无法进行入队操作;否则,我们将新元素添加到队尾指针指向的位置,并将队尾指针向后移动一位。代码如下:z0L28资讯网——每日最新资讯28at.com

int EnQueue(CircularQueue *Q, int x) {      if (IsFull(Q)) { // 如果队列已满,则无法进行入队操作          return 0; // 入队失败,返回0      } else {          Q->data[Q->rear] = x; // 将新元素添加到队尾指针指向的位置          Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针向后移动一位          return 1; // 入队成功,返回1      }  }

(5) 出队操作z0L28资讯网——每日最新资讯28at.com

出队操作就是从队列的头部移除一个元素。在实现出队操作时,我们需要先判断队列是否为空。如果队列为空,则无法进行出队操作;否则,我们移除队头指针指向的元素,并将队头指针向后移动一位。代码如下:z0L28资讯网——每日最新资讯28at.com

int DeQueue(CircularQueue *Q, int *x) {      if (IsEmpty(Q)) { // 如果队列为空,则无法进行出队操作          return 0; // 出队失败,返回0      } else {          *x = Q->data[Q->front]; // 获取队头元素的值          Q->front = (Q->front + 1) % MAXSIZE; // 队头指针向后移动一位          return 1; // 出队成功,返回1      }  }

(6) 获取队头元素z0L28资讯网——每日最新资讯28at.com

有时候,我们可能需要获取队头元素的值,但并不想将其从队列中移除。这时,我们可以实现一个获取队头元素的函数。代码如下:z0L28资讯网——每日最新资讯28at.com

int GetFront(CircularQueue *Q, int *x) {      if (IsEmpty(Q)) { // 如果队列为空,则无法获取队头元素          return 0; // 获取失败,返回0      } else {          *x = Q->data[Q->front]; // 获取队头元素的值          return 1; // 获取成功,返回1      }  }

四、循环队列的完整实现

下面是一个完整的循环队列的实现,包括初始化队列、判断队列是否为空、判断队列是否已满、入队操作、出队操作和获取队头元素等操作。代码如下:z0L28资讯网——每日最新资讯28at.com

#include <stdio.h>  #include <stdlib.h>    #define MAXSIZE 10 // 定义队列的最大容量    typedef struct {      int data[MAXSIZE]; // 存储数据的数组      int front; // 队头指针      int rear; // 队尾指针  } CircularQueue;    // 初始化队列  void InitQueue(CircularQueue *Q) {      Q->front = Q->rear = 0; // 初始化队头和队尾指针  }    // 判断队列是否为空  int IsEmpty(CircularQueue *Q) {      return Q->front == Q->rear; // 如果队头和队尾指针相等,则队列为空  }    // 判断队列是否已满  int IsFull(CircularQueue *Q) {      return (Q->rear + 1) % MAXSIZE == Q->front; // 如果队尾指针的下一个位置是队头指针,则队列已满  }    // 入队操作  int EnQueue(CircularQueue *Q, int x) {      if (IsFull(Q)) { // 如果队列已满,则无法进行入队操作          return 0; // 入队失败,返回0      } else {          Q->data[Q->rear] = x; // 将新元素添加到队尾指针指向的位置          Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针向后移动一位          return 1; // 入队成功,返回1      }  }    // 出队操作  int DeQueue(CircularQueue *Q, int *x) {      if (IsEmpty(Q)) { // 如果队列为空,则无法进行出队操作          return 0; // 出队失败,返回0      } else {          *x = Q->data[Q->front]; // 获取队头元素的值          Q->front = (Q->front + 1) % MAXSIZE; // 队头指针向后移动一位          return 1; // 出队成功,返回1      }  }    // 获取队头元素  int GetFront(CircularQueue *Q, int *x) {      if (IsEmpty(Q)) { // 如果队列为空,则无法获取队头元素          return 0; // 获取失败,返回0      } else {          *x = Q->data[Q->front]; // 获取队头元素的值          return 1; // 获取成功,返回1      }  }  int main() {      CircularQueue Q; // 创建一个循环队列实例      int x, y; // 用于存储临时数据        // 初始化队列      InitQueue(&Q);        // 测试入队操作      for (int i = 1; i <= 5; i++) {          printf("入队元素 %d/n", i);          EnQueue(&Q, i);      }        // 测试获取队头元素操作      if (GetFront(&Q, &x)) {          printf("队头元素是 %d/n", x);      } else {          printf("队列为空,无法获取队头元素/n");      }        // 测试出队操作      while (!IsEmpty(&Q)) {          if (DeQueue(&Q, &y)) {              printf("出队元素是 %d/n", y);          } else {              printf("队列为空,无法进行出队操作/n");          }      }        // 测试队列是否为空      if (IsEmpty(&Q)) {          printf("队列为空/n");      } else {          printf("队列不为空/n");      }        return 0;  }

这个测试程序首先创建一个循环队列实例,并进行初始化。然后,它进行了一系列入队操作,将1到5这五个数字依次入队。接着,它尝试获取队头元素,并打印出来。然后,它进行一系列出队操作,将队列中的元素依次移除,并打印出来。最后,它检查队列是否为空,并打印结果。通过这个测试程序,我们可以验证循环队列的实现是否正确。z0L28资讯网——每日最新资讯28at.com

五、总结与参考资料

本文介绍了如何使用C语言实现一个循环队列,包括队列的定义、入队、出队、判空和判满等操作。在实现过程中,我们遵循了专业编程规范,并使用注释进行了详细解释。循环队列是一种高效的数据结构,可以在各种应用中发挥重要作用。在实际使用中,我们可以根据具体需求对其进行扩展和优化。z0L28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-39521-0.htmlC语言代码:用 C 语言实现一个循环队列

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 你的电脑你做主!五款小工具助你一键掌控:系统更新|Defender|预装应用等操作

下一篇: 如何做好微服务容量规划?

标签:
  • 热门焦点
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 一加首款折叠屏!一加Open渲染图出炉:罕见单手可握小尺寸

    8月5日消息,此前就有爆料称,一加首款折叠屏手机将会在第三季度上市,如今随着时间临近,新机的各种消息也开始浮出水面。据悉,这款新机将会被命名为&ldquo;On
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 不容错过的MSBuild技巧,必备用法详解和实践指南

    一、MSBuild简介MSBuild是一种基于XML的构建引擎,用于在.NET Framework和.NET Core应用程序中自动化构建过程。它是Visual Studio的构建引擎,可在命令行或其他构建工具中使用
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top