【问题描述】
午后,幼儿园老师给小朋友分玩具,玩具数量和小朋友数量相同。玩具都放在箱子里,有积木和玩偶两种,有的小朋友喜欢积木,有的喜欢玩偶。
小朋友排队按次序拿玩具:
如果排在最前面的小朋友喜欢箱子最上面的玩具(只能拿最上面的玩具),那么会开心地离开队列去玩;否则不喜欢这个玩具,则会放弃,重新排到队尾,等着下一次轮到自己再拿。
这个过程会一直持续到队列里所有小朋友都不喜欢箱子最上面的玩具为止。
队列里小朋友如果喜欢积木用0表示,喜欢玩偶用1表示。
给你小朋友队列和箱子里玩具(栈),请计算出无法拿到喜欢玩具的小朋友数量。
【输入形式】
输入小朋友数量(不大于50);
输入队列(队列中0和1分别该位置小朋友喜欢积木还是玩偶);
输入玩具放入箱子的顺序,0和1表示是积木还是玩偶。
例如:
4
1 1 0 0
1 0 1 0
4:表示有4个小朋友;
1100:表示4个小朋友排队,排在前两位的小朋友喜欢玩偶,后两位的喜欢积木;
1010:表示玩具放入箱子的顺序为:玩偶,积木,玩偶,积木,即当前最上面的是积木;
【输出形式】
输出无法拿到喜欢玩具的小朋友数量。
例如:
4
1 1 0 0
1 0 1 0
拿玩具的过程如下:
队头小朋友喜欢玩偶,当前玩具为积木,放弃,排到队尾;队列变为:1001;
队头小朋友喜欢玩偶,当前玩具为积木,放弃,排到队尾;队列变为:0011;
队头小朋友喜欢积木,当前玩具为积木,拿走玩具,离队;队列变为:011;玩具101
队头小朋友喜欢积木,当前玩具为玩偶,放弃,排到队尾;队列变为:110;
队头小朋友喜欢玩偶,当前玩具为玩偶,拿走玩具,离队;队列变为:10;玩具10
队头小朋友喜欢玩偶,当前玩具为积木,放弃,排到队尾;队列变为:01;
队头小朋友喜欢积木,当前玩具为积木,拿走玩具,离队;队列变为:1;玩具1
队头小朋友喜欢玩偶,当前玩具为玩偶,拿走玩具,离队;队列变为:空;玩具空
输出:
0
【样例输入】
6
1 1 1 0 0 1
1 1 0 0 0 1
【样例输出】
3
#include<stdio.h>
#include"mytool.h"
int main()
{
SqQueue Q;
InitQueue(&Q);
SqStack P;
InitStack(&P);
int n;
QElemType p,e,a;
ElemType q;
int i=0,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&p);
EnQueue(&Q,p);
}
for(i=0;i<n;i++)
{
scanf("%d",&q);
PushStack(&P,q);
}
while(!EmptyStack(&P)&&!QueueEmpty(&Q))
{
DeQueue(&Q,&e);
GetTop(&P,&a);
if(e==a)
{
sum=0;
PopStack(&P,&a);
}
else
{
EnQueue(&Q,e);
sum++;
if(QueueLength(&Q)==sum)
break;
}
}
printf("%d",sum);
return 0;
}
标签:积木,队列,玩具,玩偶,喜欢,小朋友
From: https://blog.51cto.com/u_16030624/6192511