#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct queue{
int data[100];
int head;
int tail;
};
struct stack{
int data[10];
int top;
};
int main()
{
//两个队列用来存储小哈和小哼手中的牌
//栈用来存储桌面上的牌
struct queue q1,q2;
struct stack s;
//初始化
q1.head=0;
q1.tail=0;
q2.head=0;
q2.tail=0;
s.top=-1;
//book用来记录桌面上有没有该数字的牌
int book[10];
memset(book,0,sizeof(book));
//假设每人开始10张牌;假设牌面只有0到9,所以桌面上顶多10张牌
for(int i=1;i<=10;i++)
scanf("%d",&q1.data[q1.tail++]);
for(int j=1;j<=10;j++)
scanf("%d",&q2.data[q2.tail++]);
//当其中一个人手中没牌时游戏结束
while(q1.head!=q1.tail&&q2.head!=q2.tail){
//假设小哈先出牌
int temp=q1.data[q1.head++];
if(book[temp]==0){//桌面无此牌,入栈
s.data[++s.top]=temp;
book[temp]=1;
}
else{//桌面有此牌
//紧接着把打出的牌放到自己牌的末尾
q1.data[q1.tail++]=temp;
while(s.data[s.top]!=temp){//收赢的牌
q1.data[q1.tail++]=s.data[s.top];
book[s.data[s.top]]=0;
s.top--;
}
book[s.data[s.top]]=0;
q1.data[q1.tail]=s.data[s.top--];
}
//先判断一下小哈手中的牌,如果此时小哈手中已无牌,游戏结束
if(q1.head==q1.tail)
break;
//小哼出牌,过程同小哈,这两段相同的代码可写成函数封装起来
temp=q2.data[q2.head++];
if(book[temp]==0){//桌面无此牌,入栈
s.data[++s.top]=temp;
book[temp]=1;
}
else{//桌面有此牌
//紧接着把打出的牌放到自己牌的末尾
q2.data[q2.tail++]=temp;
while(s.data[s.top]!=temp){//收赢的牌
q2.data[q2.tail++]=s.data[s.top];
book[s.data[s.top]]=0;
s.top--;
}
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top--];
}
}
//判断输赢,假设一定有输赢
if(q2.head==q2.tail)
printf("小哈赢\n");
else
printf("小哼赢\n");
return 0;
}
栈和队列的实际应用:小猫钓鱼
最新推荐文章于 2023-10-06 23:10:28 发布