栈和队列的综合使用

//小猫钓鱼
#include<stdio.h>
//模拟手中的牌,先进先出 
struct queue
{
	int data[100];
	int head;
	int tail;
 } ;
 //模拟桌面上的牌
 struct stack
 {
 	int data[10];
 	int top;
  } ;
  int main()
  {
  	struct queue q1,q2;
  	struct stack s;
  	int book[10];//判断桌面上是否存在刚出的牌;
	int i,t;
	
	//初始化队列
	q1.head=1;q1.tail=1;
	q2.head=1;q2.tail=1;
	//初始化栈
	s.top=0;
	// 初始化数组,记录桌面上的牌
	for(i=1;i<=9;i++)
	book[i]=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]);
		q2.tail++;
	 } 
	 //队列不为空 
	 while(q1.head<q1.tail && q2.head<q2.tail) 
	 {
	 	t=q1.data[q1.head];//小胖出一张牌
		 //判断小胖出的牌能否能赢
		 if(book[t]==0)//表明桌面没有t牌
		 {
		 	q1.head++;//小胖打出一张牌出队
			 s.top++;
			 s.data[s.top]=t;//将牌放入桌面
			 book[t]=1;//标记桌面现有的牌 
		  }
		  else
		  {
		  	//小胖赢牌
			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];//依次放入队尾
			  q1.tail++;
			  s.top--;//栈中少牌,栈顶减1 
		   } 
		   } 
			t=q2.data[q2.head];//大胖出一张牌
		 //判断大胖出的牌能否能赢
		 if(book[t]==0)//表明桌面没有t牌
		 {
		 	q2.head++;//大胖打出一张牌出队
			 s.top++;
			 s.data[s.top]=t;//将牌放入桌面
			 book[t]=1;//标记桌面现有的牌 
		  }
		  else
		  {
		  	//大胖赢牌
			q2.head++;//把打出的牌出队
			q2.data[q2.tail]=t;//把打的牌放入末尾
			q2.tail++;  
		   //把桌面可以赢的牌依次放入队尾
		   while(s.data[s.top]!=t) //把桌面上的牌放到手中的末尾
		   {
		   	  book[s.data[s.top]]=0;//取消标记
			  q2.data[q2.tail]=s.data[s.top];//依次放入队尾
			  q2.tail++;
			  s.top--;//栈中少牌,栈顶减1 
		   } 
		   } 
	 } 
	    
	//判断赢牌结果 
	  
	  if(q2.head==q2.tail)
	  {
	  	printf("小胖win");
	  	printf("手牌\n"); 
		for(i=q1.head;i<=q1.tail-1;i++)
		printf("%d ",q1.data[i]);
		printf("\n"); 
		if(s.top>0)
		{
			printf("桌面上的牌是\n"); 
			for(i=1;i<=s.top;i++)
			printf("%d ",s.data[i]);
		 } 
		 else
		 printf("桌面上没牌啦"); 
	   } 
	   else
	   {
	   	printf("大胖win");
	  	printf("手牌\n");
		for(i=q2.head;i<=q2.tail-1;i++)
		printf("%d ",q2.data[i]);
		if(s.top>0)
		{
			printf("桌面上的牌是\n"); 
			for(i=1;i<=s.top;i++)
			printf("%d ",s.data[i]); 
		 } 
		 else
		 printf("桌面上没牌啦");
	   	
	   }
	   return 0; 
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值