啊哈算法学习记录:
队列与栈的应用实例–小猫钓鱼
题目:星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏一“小猫约鱼”,游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌,出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即将两张相牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
在这里要留意:
s.top++的位置
s.top++; //桌子上的牌加一
s.data[s.top]=t; //将打出的牌放在桌子上
这是因为在开头将其初始化为零的缘故,初始化为1就要将其改为
s.data[s.top]=t; //将打出的牌放在桌子上
s.top++; //桌子上的牌加一
book[9]为何初始化为10,以及每次的修改
int book[10]; //定义一个数组用来标记桌子上的牌
book[t]=1; //将桌子上该牌面标记
book[s.data[s.top]]=0;
head与hail每次的具体指向
q1.head=q1.tail=q2.head=q2.tail=1;
//q1赢牌
q1.head++; //先将牌打出去
q1.data[q1.tail]=t; //将打出去的牌放在最后
q1.tail++; //将末尾向后移 (因为加了一张牌
while(s.data[s.top]!=t) //通过循环将栈中的牌依次放在手里牌的后面 (除了“等于”的那一张
{
book[s.data[s.top]]=0; //每放一张牌就将其标记物归零
q1.data[q1.tail]=s.data[s.top]; //将栈中的牌放在后面
s.top--; //栈中的数量减一
q1.tail++; //手里牌的数量加一 (尾部后移
}
//将相等的那一张牌放在q1里
book[s.data[s.top]]=0;
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
下面展示代码:
#include<stdio.h>
struct quete //表示手中的牌
{
int data[1000];
int head; //标记手中牌的第一张
int tail; //标记手中牌的最后一张
};
struct stack //表示桌子上的牌
{
int data[10];
int top; //记录桌子上牌的数量
};
int main()
{
struct quete q1,q2; //定义两个人手中的牌
struct stack s; //定义桌子上的牌
int book[10]; //定义一个数组用来标记桌子上的牌
q1.head=q1.tail=q2.head=q2.tail=1;
int i,t;
//初始化队列
s.top=0;
//初始化用来标记的数组,又来标记哪些牌在桌子上
for(i=1;i<=6;i++)
{
book[i]=0; //全部初始化为零表示此时桌子上没有拍
}
//依次向队列中插入6张牌,表示手中的6张牌
for(i=1;i<7