小猫钓鱼———队列与栈的结合

小猫钓鱼-----队列与栈的结合
问题描述
星期天xiaoheng和xiaoha约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏–“小猫钓鱼”
游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。xiaoheng先拿出手中的第一张扑克牌放在桌上,然后xiaoha也拿出手中的第一张扑克牌,并放在xiaoheng刚打出的扑克牌上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
假如游戏开始时,xiaoheng手中有6张牌,顺序为2 4 1 2 5 6,xiaoha手中有6张牌,顺序为3 1 3 5 6 4
最终谁会获胜呢?现在你可以拿出来试一试。
接下来请你写一个程序来自动判断谁将获胜。这里我们做一个约定,xiaoheng和xiaoha手中拍的牌面只有1~9。
输入
只有两行数,每行6个数字(1~9)
输出
第一行:获胜者的名字xiaoha或xiaoheng
第二行:获胜者手里的牌
第三行:桌面剩下的牌
样例输入
2 4 1 2 5 6
3 1 3 5 6 4
样例输出
xiaoha
1 6 5 2 3 4 1
3 4 5 6 2

#include<iostream>
#include<queue>
using namespace std;
int main()
{
     queue<int> xheng;//定义xiaoheng的队列
     queue<int> xha;//定义xiaoha的队列
     int a,temp[100000],c=0;//定义桌面栈
     for(int i=1;i<=6;i++)
     {
          cin>>a;
          xheng.push(a);//将牌依次放入xiaoheng的队列中
      }
      for(int i=1;i<=6;i++)
      {
            cin>>a;
            xha.push(a);//将牌依次放入xiaoha的队列中
       }
       while(!xheng.empty()&&!xha.empty())//只要其中一人队列不为空就继续循环
       {
              // xiaoheng出牌 //
                int t1;
                t1=xheng.front();//取xiaoheng队首元素
                xheng.pop();//将xiaoheng队首元素弹出
                temp[++c]=t1;//将队首元素放入桌面栈中
                int size=c-1;
                for(int i=1;i<=size;i++)//从队首开始遍历至队尾之前的元素
                {
                         if(temp[i]==t1)//如果栈中有相同的元素
                         for(int j=size+1;j>=i;j--)
                         {
                                xheng.push(temp[c--]);//从次此元素开始至栈顶依次全部放入xiaoheng的队尾
                                temp[c+1]=0;//将栈中弹出的元素标记为0
                         }
                 }
                 if(xheng.empty())//此时如果xiaoheng的队列为空,跳出循环
                 {                           //否则让xiaoha出牌
                         break;
                 }
                 // xiaoha出牌 //
                  int t2; //xiaoha出牌方式与xiaoheng一样不在赘述
                  t2=xha.front();
                  xha.pop();
                  temp[++c]=t2;
                  size=c-1;
                  for(int i=1;i<=size;i++)
                  {
                            if(temp[i]==t2)
                             for(int j=size+1;j>=i;j--)
                             {
                                    xha.push(temp[c--]);
                                    temp[c+1]=0;
                             }
                   }
                 if(xha.empty())
                 {
                        break;
                 }
      }
        if(xheng.empty()) //判断如果xiaoheng队列为空则xiaoha赢
        {
                  cout<<"xiaoha"<<endl;
                   int size1=xha.size();
                   for(int i=1;i<=size1;i++) //遍历输出xiaoha队列元素
                   {
                              cout<<xha.front()<<' ';
                              xha.pop();
                    }
         }
        else if(xha.empty()) 判断如果xiaoha队列为空则xiaoheng赢
         {
                     cout<<"xiaoheng"<<endl;
                     int size1=xheng.size();
                     for(int i=1;i<=size1;i++) //遍历输出xiaoheng队列元素
                     {
                              cout<<xheng.front()<<' ';
                              xheng.pop();
                      }
          }
          cout<<endl;
          for(int i=1;i<=c;i++) //遍历输出桌面栈中元素
          {
                      cout<<temp[i]<<' ';
           }
          cout<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值