用-言语成功一个循环队列-C (用言语写成语有哪些)
本文将引见如何经常使用C言语成功一个循环队列,包含队列的定义、入队、出队、判空和判满等操作。代码成功将遵照专业编程规范,并经常使用注释启动详细解释。
队列是一种经常出现的数据结构,它遵照先进先出(FIFO)的准则。在实践运行中,队列经常被用于成功各种配置,如缓冲、义务调度等。而循环队列则是一种不凡的队列,它可以经过循环经常使用数组空间来防止队列中元素的糜费。在本文中,咱们将经常使用C言语来成功一个循环队列,并经过代码和注释启动详细解说。
循环队列通经常常使用一个固定大小的数组和两个指针来成功。其中一个指针指向队头元素,另一个指针指向队尾元素的下一个位置。当队列为空时,两个指针指向同一个位置;当队列为满时,队尾指针指向队头指针的前一个位置。为了成功循环成果,咱们须要对数组下标启动取模运算。
在C言语中,咱们可以定义一个结构体来示意循环队列,如下所示:
#defineMAXSIZE10//定义队列的最大容量typedefstruct{intdata[MAXSIZE];//存储数据的数组intfront;//队头指针intrear;//队尾指针}CircularQueue;
初始化队列
在经常使用循环队列之前,咱们须要对其启动初始化。初始化的环节就是将队头和队尾指针设置为同一个位置。代码如下:
voidInitQueue(CircularQueue*Q){Q->front=Q->rear=0;//初始化队头和队尾指针}
判别队列能否为空
判别队列能否为空的方法很便捷,只要要审核队头和队尾指针能否相等即可。代码如下:
intIsEmpty(CircularQueue*Q){returnQ->front==Q->rear;//假设队头和队尾指针相等,则队列为空}
判别队列能否已满
判别队列能否已满的方法也很便捷,只要要审核队尾指针能否指向队头指针的前一个位置即可。代码如下:
intIsFull(CircularQueue*Q){return(Q->rear+1)%MAXSIZE==Q->front;//假设队尾指针的下一个位置是队头指针,则队列已满}
![用](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
入队操作
入队操作就是将一个新元素增加到队列的尾部。在成功入队操作时,咱们须要先判别队列能否已满。假设队列已满,则无法启动入队操作;否则,咱们将新元素增加到队尾指针指向的位置,并将队尾指针向后移动一位。代码如下:
intEnQueue(CircularQueue*Q,intx){if(IsFull(Q)){//假设队列已满,则无法启动入队操作return0;//入队失败,前往0}else{Q->data[Q->rear]=x;//将新元素增加到队尾指针指向的位置Q->rear=(Q->rear+1)%MAXSIZE;//队尾指针向后移动一位return1;//入队成功,前往1}}
出队操作
出队操作就是从队列的头部移除一个元素。在成功出队操作时,咱们须要先判别队列能否为空。假设队列为空,则无法启动出队操作;否则,咱们移除队头指针指向的元素,并将队头指针向后移动一位。代码如下:
intDeQueue(CircularQueue*Q,int*x){if(IsEmpty(Q)){//假设队列为空,则无法启动出队操作return0;//出队失败,前往0}else{*x=Q->data[Q->front];//失掉队头元素的值Q->front=(Q->front+1)%MAXSIZE;//队头指针向后移动一位return1;//出队成功,前往1}}
失掉队头元素
有时刻,咱们或许须要失掉队头元素的值,但并不想将其从队列中移除。这时,咱们可以成功一个失掉队头元素的函数。代码如下:
intGetFront(CircularQueue*Q,int*x){if(IsEmpty(Q)){//假设队列为空,则无法失掉队头元素return0;//失掉失败,前往0}else{*x=Q->data[Q->front];//失掉队头元素的值return1;//失掉成功,前往1}}
上方是一个完整的循环队列的成功,包含初始化队列、判别队列能否为空、判别队列能否已满、入队操作、出队操作和失掉队头元素等操作。代码如下:
#include<stdio.h>#include<stdlib.h>#defineMAXSIZE10//定义队列的最大容量typedefstruct{intdata[MAXSIZE];//存储数据的数组intfront;//队头指针intrear;//队尾指针}CircularQueue;//初始化队列voidInitQueue(CircularQueue*Q){Q->front=Q->rear=0;//初始化队头和队尾指针}//判别队列能否为空intIsEmpty(CircularQueue*Q){returnQ->front==Q->rear;//假设队头和队尾指针相等,则队列为空}//判别队列能否已满intIsFull(CircularQueue*Q){return(Q->rear+1)%MAXSIZE==Q->front;//假设队尾指针的下一个位置是队头指针,则队列已满}//入队操作intEnQueue(CircularQueue*Q,intx){if(IsFull(Q)){//假设队列已满,则无法启动入队操作return0;//入队失败,前往0}else{Q->data[Q->rear]=x;//将新元素增加到队尾指针指向的位置Q->rear=(Q->rear+1)%MAXSIZE;//队尾指针向后移动一位return1;//入队成功,前往1}}//出队操作intDeQueue(CircularQueue*Q,int*x){if(IsEmpty(Q)){//假设队列为空,则无法启动出队操作return0;//出队失败,前往0}else{*x=Q->data[Q->front];//失掉队头元素的值Q->front=(Q->front+1)%MAXSIZE;//队头指针向后移动一位return1;//出队成功,前往1}}//失掉队头元素intGetFront(CircularQueue*Q,int*x){if(IsEmpty(Q)){//假设队列为空,则无法失掉队头元素return0;//失掉失败,前往0}else{*x=Q->data[Q->front];//失掉队头元素的值return1;//失掉成功,前往1}}intmn(){CircularQueueQ;//创立一个循环队列实例intx,y;//用于存储暂时数据//初始化队列InitQueue(&Q);//测试入队操作for(inti=1;i<=5;i++){printf("入队元素%dn",i);EnQueue(&Q,i);}//测试失掉队头元素操作if(GetFront(&Q,&x)){printf("队头元素是%dn",x);}else{printf("队列为空,无法失掉队头元素n");}//测试出队操作while(!IsEmpty(&Q)){if(DeQueue(&Q,&y)){printf("出队元素是%dn",y);}else{printf("队列为空,无法启动出队操作n");}}//测试队列能否为空if(IsEmpty(&Q)){printf("队列为空n");}else{printf("队列不为空n");}return0;}
这个测试程序首先创立一个循环队列实例,并启动初始化。而后,它启动了一系列入队操作,将1到5这五个数字依次入队。接着,它尝试失掉队头元素,并打印进去。而后,它启动一系列出队操作,将队列中的元素依次移除,并打印进去。最后,它审核队列能否为空,并打印结果。经过这个测试程序,咱们可以验证循环队列的成性能否正确。
本文引见了如何经常使用C言语成功一个循环队列,包含队列的定义、入队、出队、判空和判满等操作。在成功环节中,咱们遵照了专业编程规范,并经常使用注释启动了详细解释。循环队列是一种高效的数据结构,可以在各种运行中施展关键作用。在实践经常使用中,咱们可以依据详细需求对其启动裁减和优化。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。