队列和栈的结合运用———(纸牌游戏)

前言

对于了解了队列先进先出原则和栈的先进后出原则后。可以在这一章中巩固一下。

一、纸牌游戏

游戏规则:将一副扑克牌平均分成两份,每人拿一份。小周先拿出手中的第一张扑克牌放在桌上,然后小努也拿出手中的第一张扑克牌,并放在小周刚打出的扑克牌的上面,就像这样两个人交替出牌

  • (没错,是不是咱们小时候玩过的开火车?不知道你们玩的叫什么,不过规则都一样!)

二、游戏开始

小周手中有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++; 
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值