1.队列和栈的封装类似,但是栈中的方法可以使用箭头函数,而队列不建议使用箭头函数,原因是:
a.this
关键字的绑定: 箭头函数没有它们自己的 this
绑定,而是继承自外部作用域。在队列类的方法中,this
通常用于引用队列实例本身。使用箭头函数可能会导致 this
指向的是外部作用域,而不是队列实例,这可能导致错误的行为。
b.更好的阅读性: 对于类的方法,使用常规函数可以提高代码的可读性。箭头函数更适合用于短小的匿名函数或回调函数,而在类中使用它们可能使代码变得更难理解。
c.一致性: 在类中使用常规函数与传统的 JavaScript 类方法定义方式更一致。这有助于团队共同维护代码并提高代码的可维护性。
2.击鼓传花算法题(修改过游戏规则)
题目:几个朋友一起玩一个游戏,围成一圈,开始数数,数到某一个人自动淘汰,最后剩下的这个人获得胜利,请问最后剩下的是原来哪一个位置的人。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>队列的封装</title>
</head>
<body>
<script>
class Queue {
constructor() {
this.queue = [];
}
// 元素加入队列
enqueue(element) {
this.queue.push(element);
}
// 队列删除前端元素
dequeue() {
return this.queue.shift();
}
// 队列第一个元素
front() {
return this.queue[0];
}
// 队列是否有元素
isEmpty() {
return this.queue.length === 0;
}
// 队列元素个数
size() {
return this.queue.length;
}
// 将队列内容转为字符串
toString() {
return this.queue.join('');
}
}
const stackArray = ['sdf', 'qw', '超负荷', '是的感受到', '时光飞逝', '87878', '96', '抑郁']
var s = new Queue()
for (let index = 0; index < stackArray.length; index++) {
s.enqueue(stackArray[index])
}
console.log('测试是否入队列', s);
console.log('测试队列第一个元素', s.front());
console.log('测试队列是否为空', s.isEmpty());
console.log('测试队列元素个数', s.size());
console.log('测试队列内容以字符串返回', s.toString());
// 击鼓传花算法
function passGame(nameList, num) {
const queue = new Queue()
for (let i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i])
}
while (queue.size() > 1) {
for (let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue())
}
queue.dequeue()
}
const endName = queue.front()
console.log('最后剩下的人名字', endName);
return nameList.indexOf(endName)
}
const nameList = ['Alice', 'Bob', 'Charlie', 'David', 'Eve'];
const result = passGame(nameList, 3);
console.log('最后剩下的人在原数组的索引', result);
</script>
</body>
</html>