静态循环队列c程序演示
/*1、队列:一端进,另一端出;队列由两个参数决定,front(头),rear(尾);头指针指向头一个元素,尾指针指向指向最后一个元素的下一存储单元;若数组长度为n,当元素个数为n-1时就认为队列已满。r指向最后一个空的元素空间。出队:头指针往上移动,入队:尾指针向上移动,故:静态队列只能是循环队列,不然出队的元素占用的空间永远无法重复利用。1):队列的初始化:front,rear的值都是零、2):队列非空:front代表的是队列的第一个元素,rear代表的是队列的最后一个元素的下个存储单元3):队列空:front和rear的值相等,但不一定是零4):动态队列:链表实现静态队列:数组实现2、循环队列:出队:f=(f+1)%数组长度入队:r=(r+1)%数组长度+++++++++++++++++++++++++<----r++++++++++++++++++++++++++c+++++++++++++++++++++++++++b++++++++++++++++++++++++++f--->+a++++++++++++++++++++++++如何判断循环队列是否为空:如果f==r就一定为空如何判断队列已满:1)增加一个标志n记录队列元素的个数,当n=数组长度-1时,就满了。2)if((r+1)%arr.length==f){队列已满}通常使用第二种队列的具体应用:所有和时间有关的操作都有队列的影子。*/#include<stdio.h>#include<malloc.h>//静态循环队列(数组实现)程序演示typedefstructQueue{intlength;int*pBase;intfront;intrear;}QUEUE,*PQUEUE;//初始化队列voidinit(PQUEUEpQ,intlength);//判断队列是否已满boolis_full(PQUEUEpQ);//判断队列是否为空boolis_empty(PQUEUEpQ);//遍历voidtraverse(PQUEUEpQ);//入队r=(r+1)%数组长度boolen_queue(PQUEUEpQ,intval);//出队f=(f+1)%数组长度boolde_queue(PQUEUEpQ,int*val);intmain(void){QUEUEq;init(&q,6);en_queue(&q,1);en_queue(&q,2);en_queue(&q,3);en_queue(&q,4);en_queue(&q,5);traverse(&q);inta=0;de_queue(&q,&a);printf("出队的元素是:%d\n",a);traverse(&q);getchar();return0;}//初始化队列voidinit(PQUEUEpQ,intlength){//分配内存pQ->pBase=(int*)malloc(sizeof(int)*length);pQ->length=length;pQ->front=0;pQ->rear=0;//下标的都是0}//判断队列是否已满boolis_full(PQUEUEpQ){if((pQ->rear+1)%(pQ->length)==pQ->front){returntrue;}else{returnfalse;}}//判断队列是否为空boolis_empty(PQUEUEpQ){if(pQ->front==pQ->rear){returntrue;}else{returnfalse;}}//入队boolen_queue(PQUEUEpQ,intval){if(is_full(pQ)){printf("队列已满\n");returnfalse;}pQ->pBase[pQ->rear]=val;//入队,尾角标增加pQ->rear=(pQ->rear+1)%(pQ->length);returntrue;}//出队boolde_queue(PQUEUEpQ,int*val){if(is_empty(pQ)){printf("队列已空");returnfalse;}*val=pQ->pBase[pQ->front];pQ->front=(pQ->front+1)%(pQ->length);returntrue;}//遍历voidtraverse(PQUEUEpQ){inti=pQ->front;while(i!=pQ->rear){printf("%d\t",pQ->pBase[i]);i=(i+1)%(pQ->length);}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。