C语言算法—栈、队列、纸牌游戏问题

问题:

小猫钓鱼纸牌游戏:
两个人一起玩纸牌游戏,将一副扑克牌平均分成两份,其中一个人先将自己手中的第一张扑克牌放在桌上,然后另一个人也拿出手中的第一张扑克牌,并放在刚刚第一张扑克牌的上面,就像这样,两个人交替出牌,出牌时。如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放在自己手中牌的末尾,当任意一个人的手中牌全部出完时,游戏结束,对手获胜。(这里假设开始时每个人手上有六张牌)
分析:

这道题我们会用到队列和栈的相关知识,那么什么是队列和栈呢?

队列:

队列是一种特殊的线性结构,它只允许在队列的首部(head)和尾部(tail)进行插入操作,这个就叫做“入队”。举个例子:假设我们在生活中购买东西都需要你排队,这个就是一个队列,在这个队列中,新来的人总是站在队伍的最后面,来的越早的人越靠前,也就是“先进先出”原则。
就像下面这个代码:

#include<stdio.h>
main()
{
	int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;
	head=1;
	tail=10;
	while(head<tail)
	{
		printf("%d",q[head]);
		head++;
		
		q[tail]=q[head];
		tail++;
		
		head++; 
	}
	
}

这个代码所体现的就是,一个数组将第一个数删除,紧接着将第二个数放在这个数组的末尾,再将第三个数删除,将第四个数放在这个数组的末尾,依次类推;

栈:

栈与队列不同,栈是一种:“后进先出”的数据结构,例如在装子弹的时候最后装入的那枚子弹却是第一个打出去的子弹。与队列类比一下。

下面我们继续看这个问题:

首先根据上文所讲,我们需要创建一个结构体用来实现队列:

struct queue
{
	int data[100];
	int head;
	int tail;
};

上面的head用来存储队头,那么tail用来存储队尾,data用来存储元素。

下面需要再创建一个结构体来实现栈:

struct stack
{
	int data[100];
	int top;
};

top:用来存储栈项,data仍是用来存储元素的。

接下来我们要使用刚刚定义的队列结构体和栈结构体:设置q1,q2为两个人手中的牌,再定义一个栈变量s来模拟桌上的牌。

struct queue q1,q2;
struct stack s;

接下来就是c语言的常用:初始化(因为两个人最开始手上没有牌,桌子上也没有牌)

q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
s.top=0;

接下来利用循环和scanf函数循环输入两个人手中的牌

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++;
 } 

上面全部是准备工作,接下来第一个人先出牌:

t=q1.data[q1.head];

接下来既然出牌了,我们就需要进行判断,利用枚举将桌子上的每一张牌都与t进行对比,利用for循环即可:

for(i=1;i<=s.top;i++)
 {
 	if(t==s.data[i])
 	{
 		flag=1;
 		break;
	 }
 }

如果flag=0,就说明打出的牌没有与桌上牌相同的,也就意味这不能赢得桌上的牌,而flag=1就可以收回桌子上的牌直至取到的与打出的牌相同为止。

if(flag==0)
{
	q1.head++;
	s.top++;
	s.data[s.top]=t;
}
if(flag=1)
{
	q1.head++;
	q1.data[q1.tail]=t;
	
	q1.tail++;
	while(s.data[s.top]!=t)
	{
		q1.data[q1.tail]=s.data[s.top];
		q1.tail++;
		s.top--;
	}
}

以上就是对出牌的模拟,那么整个游戏结束的标志是:两个人中只要其中有一个人的牌用完了游戏就结束了,因此我们需要用一个while循环(当两个人的手中都还有牌时执行循环):

while(q1.head<q1.tail && q2.head<q2.tail)

接下来出牌决胜负阶段结束了,进行总结阶段:

if(q2.head==q2.tail)
{
	printf("q1胜利\n");
	printf("q1当前手中的牌是:");
	for(i=q1.head;i<=q1.tail-1;i++)
	{
		printf("  %d",q1.data[i]);
	 } 
	 if(s.top>0)
	 {
	 	printf("\n桌上的牌是:");
		 for(i=1;i<s.top;i++) 
		 {
		 	printf("  %d",s.data[i]);
		 }
		 else
		 {
		 	printf("\n桌上已经没有牌了"); 
		 }
	 }
}

这道题的具体思想就是这样,主要运用了队列和栈相关的知识。

发布了5 篇原创文章 · 获赞 2 · 访问量 2048

猜你喜欢

转载自blog.csdn.net/weixin_45832286/article/details/104053059