js算法之旅:用队列和栈计算出扑克玩:拖板车(小猫钓鱼) 游戏的结果
队列是什么
存储数据的方式,先进先出、后进后出,例如排队买票
栈是什么
存储数据的方式,先进后出、后进先出,例如手枪上膛了,先打出得永远是最后上进去那发子弹
游戏规则
星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。
思路
- 将两个人手上的牌想象成两个队列,打出来就是出队列,硬盘就是进队列
class Person {constructor(name, arr) {this.name = namethis.arr = arr}chu () {return this.arr.shift()}jin (arr) {for (let i = arr.length - 1; i >= 0; i--) {this.arr.push(arr[i])}console.log(`${this.name}赢牌了${arr}`);this.arr.concat(arr)}life () {if (this.arr.length) {console.log(`${this.name}手中的牌为${this.arr}`);return true}console.log(`${this.name}没牌了 游戏结束`);return false}
}const person1 = new Person('小恒', [2, 4, 1, 2, 5, 6])
const person2 = new Person('小哈', [3, 1, 3, 5, 6, 4])
- 将桌上已经出的牌当做一个栈
const arr = []
- 定义变量决定谁先出、回合数和获胜条件
let currentRound = 0let is1Chu = true
while (person1.life() && person2.life()) {//xxxx
}
- 模拟出两个人出牌的样子
while (person1.life() && person2.life()) {currentRound++const it = is1Chu ? person1.chu() : person2.chu()arr.push(it)const findIndex = arr.findIndex((item, index) => (item == it && index !== arr.length - 1))if (findIndex != -1) {const spliceArr = arr.splice(findIndex)is1Chu ? person1.jin(spliceArr) : person2.jin(spliceArr)}is1Chu = !is1Chu
}
- 游戏结束
完整实现代码
class Person {constructor(name, arr) {this.name = namethis.arr = arr}chu () {return this.arr.shift()}jin (arr) {for (let i = arr.length - 1; i >= 0; i--) {this.arr.push(arr[i])}console.log(`${this.name}赢牌了${arr}`);this.arr.concat(arr)}life () {if (this.arr.length) {console.log(`${this.name}手中的牌为${this.arr}`);return true}console.log(`${this.name}没牌了 游戏结束`);return false}
}const person1 = new Person('小恒', [2, 4, 1, 2, 5, 6])
const person2 = new Person('小哈', [3, 1, 3, 5, 6, 4])const arr = []
let currentRound = 0let is1Chu = truewhile (person1.life() && person2.life()) {currentRound++const it = is1Chu ? person1.chu() : person2.chu()arr.push(it)const findIndex = arr.findIndex((item, index) => (item == it && index !== arr.length - 1))if (findIndex != -1) {const spliceArr = arr.splice(findIndex)is1Chu ? person1.jin(spliceArr) : person2.jin(spliceArr)}is1Chu = !is1Chu
}console.log('进行了' + currentRound + '回合');
js算法之旅:用队列和栈计算出扑克玩:拖板车(小猫钓鱼) 游戏的结果相关推荐
- 数据结构与算法:链表,队列,栈,递归,有序表
反转单链表,双链表 import java.util.ArrayList; import java.util.List;public class ReverseList {public static ...
- 数据结构与算法(3)-----队列和栈
1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...
- JS 数据结构之旅 :通过JS实现栈、队列、二叉树、二分搜索树、AVL树、Trie树、并查集树、堆
JS 数据结构之旅 栈 概念 栈是一个线性结构,在计算机中是一个相当常见的数据结构. 栈的特点是只能在某一端添加或删除数据,遵循先进后出的原则 实现 每种数据结构都可以用很多种方式来实现,其实可以把栈 ...
- JS算法探险之队列(Queue)
❝ 乔布斯经常说到一句话:"Stay hungry, Stay foolish" 「Stay hungry」:永不满足, 「Stay foolish」: 是说埋头做自己的事,不要理 ...
- 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)
C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...
- 先进先出算法_结构与算法(02):队列和栈结构
一.队列结构1.基础概念 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的 ...
- 数据结构与算法(六)-背包、栈和队列
前言:许多基础数据类型都和对象的集合有关.具体来说,数据类型的值就是一组对象的集合,所有操作都是关于添加.删除或是访问集合中的对象.而且有很多高级数据结构都是以这样的结构为基石创造出来的,在本文中,我 ...
- 2.2基本算法之递归和自调用函数_数据结构与算法之5——队列和栈
栈和队列比较简单,而且实用性非常广泛,这里主要介绍一下他们的概念和实现,在很多算法中,栈和队列的运用很重要,因此,虽然简单确是最重要的数据结构之一,必须重视. 栈是保证元素后进先出(后存入者先使用,L ...
- java使用队列实现栈思路_算法面试:队列实现栈的方案
声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇介绍的是如何用两个队列实现栈的问题.这道题作为上一篇文章算法面试:栈实现队列 ...
最新文章
- OSChina 周六乱弹 —— 胖点其实挺好
- Daily Scrum 11.16
- 牛客 - 阔力梯的树(树上启发式合并)
- 【asp.net Core MVC + angular6实战】 - 1. 环境搭建
- [刨根问底] 五分钟搞懂组合评价模型—模糊Borda (以2021 年大学生数模国赛C题为例)
- 案例:控制文件序列号满故障处理和分析
- 嵌入式数据库SQLite的编译、安装和使用[ZT]
- 实战Linux Bluetooth编程 (八) Class of Device
- linux nfs限制连接数,linux – 对NFS有一个有效的稳定性参数吗?
- 顺序输出一个整数的各位数字
- Ubuntu16.04安装Unity3d2019.2.6
- 黑苹果hidp显示不清楚_bigsur 黑苹果开启HIDPI失败解决方法
- C#+ AE实现地图注记功能
- 为了找工作学习ssm
- 地理信息系统名词解释大全(三)
- html5 canvas画椭圆形
- 微信支付快速生成签名sign
- JavaScript ES6 特性
- yolov5的anchors及bbox的编解码原理
- 中国战队Newbee夺DOTA2世界冠军