栈和队列的实际应用:小猫钓鱼

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值