前言
对于了解了队列先进先出原则和栈的先进后出原则后。可以在这一章中巩固一下。
一、纸牌游戏
游戏规则:将一副扑克牌平均分成两份,每人拿一份。小周先拿出手中的第一张扑克牌放在桌上,然后小努也拿出手中的第一张扑克牌,并放在小周刚打出的扑克牌的上面,就像这样两个人交替出牌。
- (没错,是不是咱们小时候玩过的开火车?不知道你们玩的叫什么,不过规则都一样!)
二、游戏开始
小周手中有6张牌,顺序为:2 4 1 2 5 6
小努手中有6张牌,顺序为:3 1 3 5 6 4
现在我们需要写一个小程序来自动判断谁将获胜。提示:就是运用队列和栈的一些思想。
以小周出牌为例
- 一共有两个操作:出牌和赢牌(看到有一对相同的牌后,拿起,收回到自己手中。)
- 此时桌子就是一个栈,每打出一张牌放在桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。
- 赢牌的规则:如果某人打出的牌与桌上的某张牌相同,即可将两张牌以及中间所夹得牌全部取走。
- 那么如何知道桌上已经有哪些牌了呢?
- 最简单的办法就是枚举桌上的每一张牌
- 小结一下:我们需要两个队列和一个栈来模拟整个游戏
操作步骤
- 首先先来创建一个结构体用来实现队列
strcut queue{
int data[ 1000 ];
int head;
int tail;
}
head存储队头,tail存储队尾,data用来存储队列中的元素,data大小设为1000是为防止数组下标越界,其实可以设置的再大一些。
- 在创建一个结构体实现栈
struct stack{
int data[10];
int top;
}
top用来存储栈顶,数组存储栈中的元素。因为桌上最多只9张牌,所以大小设置为10就可以了。
- 现在 定义两个队列变量q1和q2,用来模拟小周和小努手中的牌
- s来模拟桌上的牌
struct queue q1,q2;
strucr stack s;
- 接下来初始化一下队列和栈
//初始化队列q1和q2为空,此时两个手中都还没有牌
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
//初始化栈s为空,最开始桌上也还没有牌、
s.top=0;
- 接下来读入小周和小努最初手中的牌
for(i=1;i<=6;i++){
scanf("%d",&q1.data[q1.tail]);
q1.tail++; //队尾往后挪一位。
}
//在读六张牌,放在小怒手上
for(i=1;i<=6;i++)
{
scanf("%d",&q2.data[q2.tail]);
}
准备工作做好,游戏正式开始
t=q1.data[q1.head];
-当小周打出第一张牌,将牌放在这个临时变量t,接下来判断小努打出的牌能否赢得桌上的牌,即判断桌上的牌有没有与t相同的,
//要枚举桌上的每一张牌与t进行比对
flag=0;
for(i=1;i<=s.top;i++){
if(t==s.data[i]){
flag=1;
break;
}
}
//如果flag的值为0,表明小努没有赢得桌上的牌,将打出的牌留在桌上
if(flag==0){
//没有赢牌
q1.head++;