使用C语言来解决循环队列问题的方法
题目描述:
大家都知道数据结构里面有一个结构叫做循环队列。顾名思义,这是一个队列,并且是循环的。但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有5条指令:
(1)PushK,让元素K进队列。
(2)Pop,对头元素出队列。
(3)QueryK,查找队列中第K个元素,注意K的合法性。
(4)Isempty,判断队列是否为空。
(5)Isfull,判断队列是否已满。
现在有N行指令,并且告诉你队列大小是M。
输入:
第一行包含两个整数N和M。1<=N,M<=100000。
接下来有N行,表示指令,指令格式见题目描述。
其中元素均在int范围。
输出:
对于指令(1),若队列已满,输出failed,否则不做输出。
对于指令(2),若队列已空,输出failed,否则不做输出。
对于指令(3),输出队列中第K个元素,若不存在,输出failed。
对于指令(4)和(5),则用yes或者no回答。
详情见样例。
样例输入:
122Push1Push2Push3Query2Query3IsemptyIsfullPopPopPopIsemptyIsfull
样例输出:
failed2failednoyesfailedyesno
AC代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #definequeuesize100001//最大队列长度 structqueue { intfront; intrear; intdata[queuesize]; intcount;//记录队列中的元素 }; voidInitQueue(structqueue*Q); voidEnQueue(structqueue*Q,intelement,intm); voidDequeue(structqueue*Q,intm); voidQueueSearch(structqueue*Q,intk,intm); intmain() { intn,m,i,element,k,flag; charcommand[10]; while(scanf("%d%d",&n,&m)!=EOF) { if(n<1||m>100000) return0; structqueue*Q; Q=malloc(sizeof(structqueue)); InitQueue(Q); for(i=0;i<n;i++) { scanf("%s",command); if(strcmp(command,"Push")==0) { scanf("%d",&element); EnQueue(Q,element,m); }elseif(strcmp(command,"Pop")==0) { Dequeue(Q,m); }elseif(strcmp(command,"Query")==0) { scanf("%d",&k); QueueSearch(Q,k,m); }elseif(strcmp(command,"Isempty")==0) { flag=(Q->count==0)?1:0; if(flag) { printf("yes\n"); }else { printf("no\n"); } }elseif(strcmp(command,"Isfull")==0) { flag=(Q->count==m)?1:0; if(flag) { printf("yes\n"); }else { printf("no\n"); } } } } return0; } /** *Description:队列初始化 */ voidInitQueue(structqueue*Q) { Q->front=Q->rear=0; Q->count=0; } /** *Description:入队操作 */ voidEnQueue(structqueue*Q,intelement,intm) { intflag; flag=(Q->count==m)?1:0; if(!flag) { Q->data[Q->rear]=element; Q->count++; Q->rear=(Q->rear+1)%m; }else { printf("failed\n"); } } /** *Description:出队操作 */ voidDequeue(structqueue*Q,intm) { intflag; intelement; flag=(Q->count==0)?1:0; if(!flag) { element=Q->data[Q->front]; Q->front=(Q->front+1)%m; Q->count--; }else { printf("failed\n"); } } /** *Description:查找队列中的指定元素 */ voidQueueSearch(structqueue*Q,intk,intm) { intflag,temp; flag=(Q->count==0)?1:0; temp=Q->front+k-1; if((!flag)&&(k<=m&&k>=1)) { if((Q->front<Q->rear)&&(Q->front<=temp&&Q->rear>temp)) printf("%d\n",Q->data[temp]); elseif((Q->front>Q->rear)&&(temp>=Q->front||temp<Q->rear)) printf("%d\n",Q->data[temp]); elseif(Q->front==Q->rear) printf("%d\n",Q->data[temp]); else printf("failed\n"); }else { printf("failed\n"); } }