参考书:啊哈算法
题目:星期天小哼和小哈约在一块玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”(类似小时候玩的丁沟钓鱼)。游戏规则:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌子上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹得牌全部取走,并依次放到自己自己手中牌的末尾。当人以一人手中的牌全部出完时,游戏结束,对手获胜。

应用知识:用结构体定义栈和队列

题目分析:小哼和小哈手中的牌用两个队列存放,队列用head存储队头,tail存储队尾;出牌就是出队,head++‘’赢牌就是入队,tail++。桌子上的牌用一个栈存放,用top存放栈顶,其中一个人出牌,top++,其中一个人赢牌,top–。有人赢牌的话,依次将桌上的牌拿走。

栈与队列:此题所用的栈顶用top表示,从下标1开始存放数据,top表示栈顶,但top这个下标不存放数据,栈内有效的总数据个数为top-1;类似的,队列的队头和队尾分别用head和tail表示,队头head从1开,队尾tail这个下标也不存放数据,队列内有效的总数据个数为tail - head。

内容须知:类似桶排序,定义一个book数组,全部为零。若桌上有一张牌t,令book[t]=1;

解题思路:
1.定义队列和栈的结构体,定义两个队列q1和q2,一个栈s,初始化队列和栈。
2.把小哼和小哈的牌读入队列内。
3.在两个队列队头都不等于队尾的情况下依次遍历,知道有一方队头等于队尾,游戏结束。
4.小哼先出牌,判断桌面上是否有这张牌(用book数组)。
5.若没有,则把这张牌放到桌面上。
6.若有,则把这张牌放到队尾,然后把两个相同牌中间的牌也依次放到队尾。
7.小哈出牌,类似小哼出牌,和上述步骤5和步骤6一样。

8.判断队头和队尾是否相等,然后根据需求输出想要的。

代码如下:

//方法一:自己定义栈和队列
#include<iostream>
using namespace std;
struct queue
{int head;int tail;int data[1000];
};
struct stack
{int data[1000];int top;
};
int main()
{queue q1,q2;//两个人手中的牌存放在队列中stack s;int i,t,book[10];q1.head=q1.tail=1;//队列初始化q2.head=q2.tail=1;//队列下标从1开始 s.top=1; //栈初始化,下标从1开始for(i=1;i<10;i++) book[i]=0;//初始化用来标记的数组,用来标记那些数已经在桌子上 for(i=1;i<=6;i++){cin>>q1.data[q1.tail];q1.tail++;}//小哼q1手上的牌for(i=1;i<=6;i++){cin>>q2.data[q2.tail];q2.tail++;}//小哈q2手上的牌 while(q1.head<q1.tail && q2.head<q2.tail){t=q1.data[q1.head];//小哼q1先出牌;if(book[t] == 0)//表示桌面上没有t这张牌 {q1.head++; s.data[s.top]=t; s.top++;book[t]=1;//标记桌子上已有t这张牌 }else//表示桌面上有t这张牌 {q1.head++;q1.data[q1.tail]=t;//把打的牌放到队尾 q1.tail++;while((s.data[--s.top]) !=t )//s.top-1才是栈顶的下标 { 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++;}if(q1.head == q1.tail) break;t=q2.data[q2.head];if(book[t] == 0)//桌上没有牌t {q2.head++;s.data[s.top]=t;s.top++;book[t]=1;}else//桌上有牌t {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++;}} if(q2.head == q2.tail){cout<<"小哼 win"<<endl;cout<<"小哼当前手中的牌是";for(i=q1.head; i<q1.tail; i++)cout<<" "<<q1.data[i];cout<<endl;if(s.top>1) //桌子上有牌 {cout<<"此时桌子上的牌为:";for(i=1;i<s.top;i++)cout<<" "<<s.data[i];cout<<endl;} else cout<<"桌子上已经没有牌了"<<endl;} else{cout<<"小哈 win"<<endl;cout<<"小哈当前手中的牌是";for(i=q2.head ; i<q2.tail ; i++)cout<<" "<<q2.data[i];if(s.top>1){cout<<"此时桌子上的牌为:";for(i=1;i<s.top;i++)cout<<" "<<s.data[i];cout<<endl;}else cout<<"桌子上已经没有牌了"<<endl;}return 0;
}

测试如下:

小猫钓鱼——(c++用栈和队列实现)相关推荐

  1. 栈和队列——小猫钓鱼

    ​ 星期天A和B在一起玩扑克牌,他们在玩一个古怪的扑克牌游戏--小猫钓鱼.游戏的规则是这样的,将一副扑克牌平均分成两份,每人拿一份.A先拿出手中的第一章牌放在桌上,然后B也从手里拿出一张牌放在桌上,就 ...

  2. 栈,队列(纸牌游戏,小猫钓鱼)

    文章目录 队列:FIFO 实现顺序队列: 1.顺序循环队基本操作 2.链队 栈 1. 顺序栈 栈的元素 初始化操作 入栈操作 判断顺序栈是否为空 栈的长度 出栈 清空一个栈 销毁顺序栈 2.链式栈 应 ...

  3. 小猫钓鱼——栈、队列的应用(C++)

    一.游戏规则: 将一副扑克牌(假设牌面只有1~9)平均分成两份,每人拿一份.小哼先拿出手中的第一张扑克牌放在桌子上,然后小哈也拿出手中的第一张扑克牌,放在小哼刚打出的扑克牌的上面,就这样两人交替出牌. ...

  4. 栈和队列在python中的实现

    栈和队列是两种基本的数据结构,同为容器类型,队列是先进先出,栈是先进后出. 栈 栈提供 push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterat ...

  5. c++数据结构队列栈尸体_一本正经的聊数据结构(3):栈和队列

    前文传送门: 「一本正经的聊数据结构(1):时间复杂度」 「一本正经的聊数据结构(2):数组与向量」 引言 前一篇内容我们介绍了数组和向量,虽然说向量是数组的一个升级版,但是在另一个维度上,他们都属于 ...

  6. 剑指offer:面试题09. 用两个栈实现队列

    题目:用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有 ...

  7. leetcode-232 用栈实现队列

    使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元素. peek() – 返回队列首部的元素. empty() – 返回队列是否为空 栈的特点 ...

  8. 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解

    一.解释定义 1. 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.再简单描述一下:数据结构就是描述对象间逻辑关系的学科. 如果还是不太清楚下面会举例说明的. 2. 数据存储结 ...

  9. 数据结构,堆和栈和队列的概念

    数据结构,堆和栈和队列的概念 1 什么是数据结构 数据结构是计算机存储,组织数据的反复改.数据结构是指相互之间存在的一种或多种特定关系的数据元素集合. 2 数据结构的逻辑结构 1 集合结构,元素都是孤 ...

最新文章

  1. html table相关标签和属性
  2. docker安装RabbitMQ镜像
  3. 四十三、Linux磁盘管理和Shell编程
  4. 用postman在CSDN上创建博客
  5. 事业单位职称工资计算机,终于!事业单位绩效工资、职称变了!关系上千万人收入!...
  6. 《高性能网站建设指南》勘误
  7. ReadWriteLock读写文件
  8. android sp wp实例,android sp wp详解
  9. mac android通知中心,少数派一周快读:iOS 8 输入法大比拼,升级 Mac 新系统的 6 项准备,如何保持 Android 通知栏整洁...
  10. BZOJ 1412: [ZJOI2009]狼和羊的故事( 最小割 )
  11. yyuc视图未更新,控制器修改可以看到,视图无法更新,提示Allowed memory size of exhausted
  12. 计算机桌面锁屏壁纸怎么换,电脑怎么换锁屏壁纸
  13. 微信支付只为移动游戏而生,仅仅是腾讯Q币的备胎
  14. 2022最新WiFi大师小程序V3.0.9独立版源码
  15. 【新书速递】流量运营教科书
  16. 名帖32 东汉 隶书《韩仁铭碑》
  17. 如何计算 R 中卡方统计量的 P 值
  18. pc模式 华为mate30_华为Mate30系列10个隐藏黑科技
  19. sqlserver加上百分号_用一条sql语句显示数据百分比并加百分号
  20. Hadoop安装配置(转自虾皮工作室)

热门文章

  1. cisco交换机故障Flash空间不足
  2. 上传自己库到Cocoapods和遇见的各种问题解决
  3. android studio 无法联网搜索插件
  4. 汇编基础教程(5)程序编写
  5. 京城最惨地产商:股价跌到8毛1,滞留海外曾为女星豪掷1亿
  6. FPGA从入门到精通(8)-BRAM
  7. VCIP2020:VVC中的ACT
  8. 什么是换手率?如何计算?
  9. 【文学文娱】《那些年我们追过的诗词》
  10. Enterprise Architect 7.5汉化版发布!