队列和栈的综合案例
2018-01-10 09:05
99 查看
1、需求
现在有小明和小红两个人,他们在玩一个打牌游戏,规则是这样的:每个人6张牌,每人每次打出一张牌放在桌子上,如果哪次打出的牌跟桌子上的牌相同,则把这之间相同的牌收回放到自己牌的末尾。谁的牌先打完,代表谁先输。前提是我们的牌只有1-9这9张。2、分析
两个人的牌,我们用两个队列表示,打牌就是出队,赢牌收到自己手中就是入队。打出的牌放在桌子上我们用一个栈表示,用一个数组记录桌子上已经有的牌。3、代码
3.1 定义队列和栈
struct queue { int data[1000]; int head; int tail; }; struct stack { int data[10]; int top; };
3.2 定义队列和栈、数组、变量
struct queue q1,q2; struct stack s; int book[10]; /*因为只有12张牌,每个人的牌都是1-9之中的数组,不可能桌子上的牌的数量大于10,所以定义一个长度10的数组来记录正好。*/ int i,t;
3.3初始化队列和栈及标记桌子上牌的数组
//初始化队列和栈 q1.head=1,q1.tail=1; q2.head=1,q2.tail=1; s.top=0; //初始化用来标记哪些排在桌子上的数组 for(i=1;i<=9;i++){ book[i]=0; }
3.4分发牌给小明和小红
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++; }
3.5判断是否能赢牌的关键代码
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--; } //收回桌子上牌面为t的牌 book[s.data[s.top]] =0; q1.data[q1.tail]=s.data[s.top]; q1.tail++; s.top--; }
3.6完整代码
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct queue { int data[1000]; int head; int tail; }; struct stack { int data[10]; int top; };
int main(int argc, char *argv[]) {
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;
}
//依次向队列插入6个数(代表初始化两个人手中的牌)
printf("请输入小明手中的牌:\n");
for(i=1;i<=6;i++){
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
printf("\n***********小明手中的牌输入完毕***********\n");
printf("请输入小红手中的牌:\n");
for(i=1;i<=6;i++){
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
printf("\n**********************\n");
//当队列不为空时循环(即两人手中牌不为空的时候)
while(q1.head<q1.tail&&q2.head<q2.tail){
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--;
}
//收回桌子上牌面为t的牌
book[s.data[s.top]] =0;
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
//如果小明手中的牌打完了,则游戏结束
if(q1.head==q1.tail){
break;
}
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++;
w
8e40
hile(s.data[s.top]!=t){
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
//收回桌子上牌面为t的牌
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
}
if(q2.head==q2.tail){
printf("小明win\n");
printf("小明当前手中的牌是:");
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桌子上已经没有牌了。");
}
}else{
printf("小红win\n");
printf("小红当前手中的牌是:");
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("\n桌子上已经没有牌了。");
}
}
getchar();getchar();
return 0;
}
3.7 结果截图
相关文章推荐
- 综合案例-数据库的创建和删除
- Windows7下IIS7.5的伪静态URL Rewrite安装配置和案例综合
- Linux下Apache与MySQL+PHP的综合应用案例
- (源码)Android综合案例(经典)
- Java学习笔记17(面向对象十:综合案例)
- Java数组基础综合案例
- 新闻客户端综合案例
- AngularJs实现商品购物车综合案例完整
- 7.6.3 泛型的综合使用案例
- 【雪野实训记录】Oracle宾馆管理系统-L2综合项目案例
- BufferedReader笔记与综合案例
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
- ReactNative-综合案例(01)
- ACL的综合应用案例
- 【性能诊断】十一、性能问题综合分析(案例2,windbg、wireshark)
- 循环队列的综合操作(出入队、获取队长度)C语言实现
- Struts2_Spring4_Hibernate4整合及综合案例
- Linux学习笔记——例说makefile 综合案例
- springcloud入门之综合入门小案例
- 线程高级应用-心得7-java5线程并发库中阻塞队列Condition的应用及案例分析