发布时间:2024-08-08 18:01
我们知道栈和队列能实现很多算法。
但是作为初学者,想要实现那些复杂、高深的算法其实挺难的。
那我们能不用用简单队列和栈做一些简单的程序呢?
我们做一个简单的纸牌游戏。
现在假设有玩家A和玩家B玩纸牌游戏。
假定每人手上6张牌。
玩家A和玩家B轮流出牌。
当某一位玩家出的牌与桌面上的牌相同时,就可以把这两张牌以及中间夹带的N张牌一起拿走放到自己手牌的末尾。
当玩家手上没有牌时,就输。
很显然,桌子上的牌我们可以用栈操作;手上的牌可以用队列实现。
我们知道要运用两个工具,但是如何实现他呢?
//用结构体定义队列
struct queue
{
int data[1000];
int head;
int tail;
};
//用结构体定义栈
struct stack
{
int data[10];
int top;
};
基本操作完成,接下来呢?
//有了结构体,当然需要定义结构体变量
struct queue q1,q2;
struct stack s;
下一步就是初始化
//初始化队列头尾、栈顶
q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
s.top=0;
//我们需要一个标记数组,用来判断出的牌跟桌子上的牌是否相同
int book[10]={0};
初始化结束,下面就摸牌!我们用输入的方式实现!
for(int i=1;i<=6;i++)
{
scanf("%d",q1.data[q1.tail]);
q1.tail++;
}
for(int i=1;i<=6;i++)
{
scanf("%d",q2.data[q2.tail]);
q2.tail++;
}
接下来就到游戏环节啦!
while(q1.head
玩家B的方式与玩家A的方式一样,这里就不写重复了。
下面就是判断游戏的胜负。
if(q1.head==q1.tail)
{
printf("玩家B赢\n");
printf("玩家B手上的牌为:\n");
for(int i=q1.head;i<=q1.tail-1;i++)
printf("%d ",q1.data[i]);
if(s.top>0)
{
printf("桌子上的牌为:\n");
for(int i=1;i<=s.top;i++)
printf("%d ",s.data[i]);
}
else
printf("桌子上没牌\n");
}
玩家A赢的方式与玩家B赢的方式一样,因为懒所以也不写了。
#define _CRT_SECURE_NO_WARNINGS
#include
//定义一个结构体队列用来模拟玩家手中的牌
struct queue
{
int data[1000];
int head;
int tail;
};
//定义一个结构体栈用来模拟桌子上的牌
struct stack
{
int data[10];
int top;
};
int main()
{
//定义结构体变量
struct queue q1, q2;
struct stack s;
//定义一个标记数组,用来判断与桌上的牌是否相同
int book[10] = { 0 };
//初始化队列和栈
q1.head = 1;
q1.tail = 1;
q2.head = 1;
q2.tail = 1;
s.top = 0;
//用scanf函数模拟发牌
for (int i = 1; i <= 6; i++)
{
scanf("%d", &q1.data[q1.tail]);
q1.tail++;
}
for (int i = 1; i <= 6; i++)
{
scanf("%d", &q2.data[q2.tail]);
q2.tail++;
}
//模拟玩家放牌
int t = 0;//定义一个放牌的临时变量
while (q1.head < q1.tail && q2.head < q2.tail)
{
//模拟玩家1放牌
t = q1.data[q1.head];
//当桌子上没有这张牌时
if (book[t] == 0)
{
//出队
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--;
}
book[s.data[s.top]] = 0;
q1.data[q1.tail] = s.data[s.top];
q1.tail++;
s.top--;
}
if (q1.head == q1.tail)
break;
//模拟玩家2放牌
t = q2.data[q2.head];
//当桌子上没有这张牌时
if (book[t] == 0)
{
//出队
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--;
}
book[s.data[s.top]] = 0;
q2.data[q2.tail] = s.data[s.top];
q2.tail++;
s.top--;
}
}
//判断游戏胜负
if (q2.head == q2.tail)
{
printf("玩家A赢\n");
printf("玩家A手上的牌为\n");
for (int i = q1.head; i <= q1.tail - 1; i++)
printf("%d ", q1.data[i]);
printf("\n");
if (s.top > 0)
{
printf("桌子上的牌为\n");
for (int i = 1; i <= s.top; i++)
printf("%d ", s.data[i]);
}
else
printf("桌子上没牌\n");
}
else
{
printf("玩家B赢\n");
printf("玩家B手上的牌为\n");
for (int i = q2.head; i <= q2.tail - 1; i++)
printf("%d ", q2.data[i]);
printf("\n");
if (s.top > 0)
{
printf("桌子上的牌为\n");
for (int i = 1; i <= s.top; i++)
printf("%d ", s.data[i]);
}
else
printf("桌子上没牌\n");
}
return 0;
}