《啊哈!算法》中的小猫钓鱼例题,结合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;
}