使用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");
}
}