首先这个题非常的奇怪,它明明说输出yes或者no但是在输入样例里面直接输入yes或者no,并且评阅的时候yes或者no也是当成输入项,应该是题目有点问题。
抛开这个小瑕疵,这道题考察的是循环队列的建立插入删除等操作。需要注意的几点有:
1.建立循环链表的时候尽量多申请一个空间用于判空;
2.删除操作不是只删除一项,由于队列只能从一边删除,所以删除时需要将比这个元素先入队的所有元素都删除;
话不多说上代码:
#include<stdio.h>
#include <stdlib.h>
#define ok 1
#define error 0
typedef struct//定义循环链表
{
int *data;//定义一个int数组
int front;//这里的指针根本不是指针,是表示元素的位置的数字
int rear;//虽然题目没有说需要定义front但是为了规范化减少运算我们还是引入front
int length;
int m;
}seq;
void creatQueue(seq *q,int n)//动态分配数组大小
{
q->m=n+1;//多加一个空间判满
q->data=(int*)malloc(sizeof(int)*(q->m));
q->length=q->rear=q->front=0;
}
int EnterQueue(seq *q,int x)
{
if((q->rear+1)%(q->m)==q->front) return error;//此时队满
q->data[q->rear]=x;
q->rear=(q->rear+1)%(q->m);
return ok;
}
int DeleteQueue(seq*q)//x返回删除的值
{
if(q->front==q->rear) return error;//队列为空
q->front=(q->front+1)%(q->m);
return ok;
}
int main()
{
int M;//队列的长度
scanf("%d",&M);
seq *q;
q=(seq*)malloc(sizeof(seq));
creatQueue(q,M);
while(1)//输入队列和yes或者no
{
int x;
scanf("%d",&x);
EnterQueue(q,x);
char c=getchar();
if(c=='\n') break;
}
char s[5];
scanf("%s",s);
int k;//要删除的元素
scanf("%d",&k);
while(q->data[q->front]!=k)
{
DeleteQueue(q);
}//一直删除到指定元素前一个元素
DeleteQueue(q);//删除指定元素
int o;//保存队头元素
o=q->data[q->front];
while(q->front!=q->rear)
{
printf("%d ",q->data[q->front]);
q->front=(q->front+1)%(q->m);
}
printf("\n");
printf("%d",o);
return 0;
}