队列是什么
存储数据的方式,先进先出、后进后出,例如排队买票
栈是什么
存储数据的方式,先进后出、后进先出,例如手枪上膛了,先打出得永远是最后上进去那发子弹
游戏规则
星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。
思路
- 将两个人手上的牌想象成两个队列,打出来就是出队列,硬盘就是进队列
class Person {
constructor(name, arr) {
this.name = name
this.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 = 0
let 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 = name
this.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 = 0
let is1Chu = true
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
}
console.log('进行了' + currentRound + '回合');