栈与队列,小猫钓鱼

//小哼和小哈玩小猫钓鱼,每人先摸6张牌,小哼先拿牌,然后依次出牌,若牌与桌上的相同则将出的牌放在牌尾,并将之间的牌放入手牌的末尾,否则将牌打至桌上,问谁能获胜。
#include <cstdio>
#include <queue>
#include <stack>
using namespace std;
 int main()
 {

     queue<int>q1;
     queue<int>q2;
     stack<int>s;
     int i,j,a,n,temp;
     int vis[10]={0};//vis数组保存1~9的牌有没有在桌上(栈中),不可能在栈中出现两张相同的牌,否则早就被钓走了
     for (i=1;i<=6;i++)
     {
         scanf("%d",&a);
         q1.push(a);

     }//小哼拿六张牌
     for (i=1;i<=6;i++)
     {
         scanf("%d",&a);
         q2.push(a);

     }//小哈拿六张牌
     while((!q1.empty())&&(!q2.empty()))//小哼和小哈手上必须都有牌(栈都不为空),否则有一个没牌了,游戏结束
     {
         temp=q1.front();
         q1.pop();//不管赢牌输牌都要把牌先拿出来(如果赢牌就要放在最后,输牌就要放在桌上,反正都不会在这了~~)
         if (vis[temp]==1)//如果桌上有这张牌
         {
            q1.push(temp);//先把这张牌放入小哼的排尾,接下来就是拿桌上的牌
            while(s.top()!=temp)//这里注意桌上的大小为temp的牌只可能有一张~~,所以只要栈顶不为temp即可
         {
             q1.push(s.top());//把桌上的第一张牌拿走放在小哼的排尾
             s.pop();
         }
         vis[temp]=0;//取消标记,桌上没有temp牌了~~
         }
         if (vis[temp]==0)//如果桌上没有这张牌,别忘了把这张牌放在桌上(之前不要放是因为赢牌了)
         {
             s.push(temp);
             vis[temp]=1;//打上标记,temp牌桌上有了
         }
         //以上都为小哼的操作
         temp=q2.front();
         q2.pop();
         if (vis[temp]==1)
         {
             q2.push(temp);
             while(s.top()!=temp)
            {
               q2.push(temp);
               s.pop();
            }
            vis[temp]=0;
         }
         if (vis[temp]==0)
           {
               s.push(temp);
               vis[temp]=1;
           }

    }
    if (q1.empty())
        printf("小哈获胜\n");//小哈手中还有余牌
    else
        printf("小哼获胜\n");//小哼手中还有余牌
    return 0;
}


你可能感兴趣的:(栈与队列,小猫钓鱼)