小猫钓鱼-队列和栈的使用

这篇博客通过C++编程实现了一个名为'小猫钓鱼'的游戏,利用STL库中的队列和栈来模拟游戏过程。玩家分别为小猫和小鱼,每次出牌尝试匹配相同数字以收集牌,直至一方手中无牌。博客详细展示了代码逻辑,并在游戏结束时输出赢家和剩余的桌面牌。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《啊哈!算法》中的小猫钓鱼例题,结合C++提供的STL库实现要求。

#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
using namespace std;
int main()
{
    queue <int> Ca;//猫的牌面
    queue <int> Fi;//🐟的牌面
    stack <int> Stk;//桌子上的牌
    int data[10];
    memset(data,0,sizeof(int)*10);
    int cat[6]={2,4,1,2,5,6};
    int fishi[6]={3,1,3,5,6,4};
    for(int i=0;i<6;i++)
    Ca.push(cat[i]);
    for(int i=0;i<6;i++)
    Fi.push(fishi[i]);
    puts("小鱼先出牌!");
    while(!Ca.empty() && !Fi.empty())
    { 
        if(data[Ca.front()]!=0)//如果有相同的牌,则进行操作
        {
            //首先要先把这张牌打出去,再收进来,那也会放在队尾
            Ca.push(Ca.front());
            //后续要将这张牌打出去,即出队,但后续要用到队头元素,晚点出队
            while(Stk.top()!=Ca.front())//收起两张相同牌之间的牌
            {
                //收牌过程,要更新桌子上的数据
                data[Stk.top()]=0;
                Ca.push(Stk.top());
                Stk.pop();
            }
            //到这里,栈中栈顶元素就是相同的牌了,收起来
            Ca.push(Stk.top());
            data[Ca.front()]=0;
            Ca.pop();//出队刚开始的那张牌
            Stk.pop();
        }//在这里猫的存在相同牌的操作完成
        else//没有相同牌面的牌再在桌子上,就直接放牌就行   
        {
                data[Ca.front()]=1;
                Stk.push(Ca.front());
                Ca.pop();
                if(Ca.empty())
                break;
        }
        //小鱼也是相同的操作
        if(data[Fi.front()]!=0)//如果有相同的牌,则进行操作
        {
            //首先要先把这张牌打出去,再收进来,那也会放再队尾
            Fi.push(Fi.front());
            data[Fi.front()]=0;
            //后续要将这张牌打出去,即出队,但后续要用到队头元素,晚点出队
            while(Stk.top()!=Fi.front())//收起两张相同牌之间的牌
            {
                //收牌过程,要更新桌子上的数据
                data[Stk.top()]=0;
                Fi.push(Stk.top());
                Stk.pop();
            }
            //到这里,栈中栈顶元素就是相同的牌了,收起来
            Fi.push(Stk.top());
            Fi.pop();//出队刚开始的那张牌
            Stk.pop();
        }//在这里🐟的存在相同牌的操作完成
        else//没有相同牌面的牌再在桌子上,就直接放牌就行   
        {
                data[Fi.front()]=1;
                Stk.push(Fi.front());
                Fi.pop();
                if(Fi.empty())
                break;
        }
    }
    if(Ca.empty())
    {
        puts("小鱼儿赢了!牛呀!");
        puts("小鱼手中的牌为:");
        while(!Fi.empty())
        {
            printf("%d ",Fi.front());
            Fi.pop();
        }
        putchar('\n');
        puts("桌面上的牌为:");
        while(!Stk.empty())
        {
            printf("%d ",Stk.top());
            Stk.pop();
        }
    }
    else
    {
        puts("喵咪赢了!牛呀!");
        puts("喵咪手中的牌为:");
        while(!Ca.empty())
        {
            printf("%d ",Ca.front());
            Ca.pop();
        }
        putchar('\n');
        puts("桌面上的牌为:");
        while(!Stk.empty())
        {
            printf("%d ",Stk.top());
            Stk.pop();
        }
    }
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值