题目描述
小张经常会在打饭排队的时候由于无聊而东张西望。今天他对隔壁的打饭队伍进行了详细观察。隔壁队伍每次到达一名同学,他就会记录下这个同学的名字,同时队伍的第一个同学打饭完成后会离开队伍。同时小张有时候想关注一下队首或队尾的同学是谁。
输入
第一行一个数
n
(
1
≤
n
≤
1000000
)
n(1 \leq n \leq 1000000)
n(1≤n≤1000000) ,表示小张要求你实现的操作数量。
接下来 n 行,有以下四种操作。
-
Arrive Student_name 表示一名叫"Student_name"的同学到达了。保证名字的长度小于20,且只有英文字母。
-
Leave,表示队首的同学打完饭离开。
-
QueueHead,查询队首的同学名字,如果队列为空,输出"Empty queue",不加引号。
-
QueueTail,查询队尾的同学名字,如果队列为空,输出"Empty queue",不加引号。
输出
按照操作要求进行输出。
样例
输入(1)
9
Arrive Mike
Arrive Zhangsan
QueueHead
QueueTail
Leave
QueueHead
Leave
QueueHead
QueueTail
输出(1)
Mike
Zhangsan
Zhangsan
Empty queue
Empty queue
代码
#include <stdio.h>
#include <string.h>
char line[1000005][21];//这道题很神奇的点在于可以使用队列的顺序存储结构
int main()
{
long int n;
scanf("%ld",&n);
long int count=0;
char c1[10]="Arrive",c2[10]="Leave",c3[10]="QueueHead",c4[10]="QueueTail";//首先建立四个样例字符串,用来判断输入
long int a=1,b=1;//用来表示队列的头和尾的位置数字
for(long int i=1;i<=n;i++)
{
char c[10]={};
scanf("%s",&c);
if(strcmp(c,c1)==0)//如果是来了一个人,把他的名字压到队列最后面 ,尾部位置的表示数字+1
{
count++;
scanf("%s",line[b]);
b++;
}
if(strcmp(c,c2)==0)//如果是走了一个人,删掉队列最前面的那个人 ,头部位置的表示数字+1
{
if(count!=0)
{
count--;
a++;
}
}
if(strcmp(c,c3)==0)//如果是输出排头
{
if(count==0)
{
printf("Empty queue\n");//空队列就输出空队列
}
else
{
printf("%s\n",line[a]);//非空输出排头
}
}
if(strcmp(c,c4)==0)//如果是输出队尾
{
if(count==0)
{
printf("Empty queue\n");//空队列就输出空队列
}
else
{
printf("%s\n",line[b-1]);//非空输出队尾
}
}
}
return 0;
}