案例分析

我们知道栈和队列能实现很多算法。

但是作为初学者,想要实现那些复杂、高深的算法其实挺难的。

那我们能不用用简单队列和栈做一些简单的程序呢?

我们做一个简单的纸牌游戏。

现在假设有玩家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<q1.tail && q2.head<q2.tail) { //模拟玩家A出牌 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--; } }
玩家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 <stdio.h> //定义一个结构体队列用来模拟玩家手中的牌
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; }

技术
©2019-2020 Toolsou All rights reserved,
TypeScript:函数类型接口8道大厂指针笔试题让你秒杀指针!!!MySQL 日期时间加减mysql 查询条件之外的数据_mysql 查询符合条件的数据查linux的操作系统版本,如何查看Linux操作系统版本?将String类型转换成Map数据类型使用uuid做MySQL主键,被老板,爆怼一顿C语言中的字符串函数和字符函数linux服务器中毒排查--基础篇C# ASCII码字符转换