As filas 先进先出
são semelhantes às filas da vida: quem entrar primeiro na fila será atendido primeiro, depois sairá primeiro e quem chegar depois ficará no final da fila.
Existem duas formas de implementar filas com js: arrays e objetos O código de implementação é o seguinte:
1. Implementar filas através de arrays
<script>
// 封装队列类
function Queue() {
// 属性
this.items = [];
// 方法
// 1.将元素加入到队列中
Queue.prototype.enqueue = function (element) {
this.items.push(element);
}
// 2.从队列中删除前端元素
Queue.prototype.dequeue = function () {
return this.items.shift();
}
// 3.查看前端的元素
Queue.prototype.front = function () {
return this.items[0];
}
// 4.查看队列是否为空
Queue.prototype.isEmpty = function () {
return this.items.length == 0;
}
// 5.查看队列中元素个数
Queue.prototype.size = function () {
return this.items.length;
}
// 6.toString方法
Queue.prototype.toString = function () {
var str = ''
for (var i = 0; i < this.items.length; i++) {
str = str + this.items[i] + ' ';
}
return str;
}
}
// 使用队列
/*var queue = new Queue();
queue.enqueue('abc');
queue.enqueue('def');
queue.enqueue('ghl');
console.log(queue.items);
queue.dequeue();
console.log(queue.items);
console.log(queue.front());
console.log(queue.isEmpty());
console.log(queue.size());
console.log(queue.toString());*/
// 面试题:击鼓传花
function gamePass(nameList, num) {
// 1.定义一个队列结构
var queue = new Queue();
// 2.将所有人加入到队列中
for (var i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
}
// 3.开始数数字
while (queue.size() > 1) {
// 不是num的时候,重新加入到队列尾部
// 是num这个数字的时候,将其从队列中删除
// 3.1.num数字之前的人重新放人队列尾部
for (var i = 0; i < num - 1; i++) {
var detele = queue.dequeue();
var enter = queue.enqueue(detele);
}
// 3.2.num对应这个人,直接从队列中删除
queue.dequeue();
}
// 4.获取队列中的那个人
alert(queue.size());
var endName = queue.front();
alert('最终剩下的人:' + endName);
return name.indexOf(endName);
}
console.log(gamePass(['mary', 'lili', 'chenjie', 'wangbo', 'sunshine'], 3))
</script>
2. Implementando filas através de objetos
// 封装一个队列
class Queue {
constructor() {
this.count = 0;
this.items = {
};
this.lowestCount = 0; // 追踪第一个元素
}
enqueue(item) {
this.items[this.count] = item;
this.count++;
};
dequeue() {
if (this.isEmpty()) return false;
var result = this.items[this.lowestCount];
delete this.items[this.lowestCount];
this.lowestCount++;
return result;
};
peek() {
if (this.isEmpty()) return false;
return this.items[this.lowestCount];
};
isEmpty() {
return this.count - this.lowestCount == 0
};
size() {
return this.count - this.lowestCount;
};
clear() {
this.count = 0;
this.items = {
};
this.lowestCount = 0; // 追踪第一个元素
}
toString() {
let str = '';
for (var i = this.lowestCount; i < this.count; i++) {
str += this.items[i] + ' ';
}
return str;
}
}
// 测试代码
// const queue = new Queue();
// queue.enqueue('John')
// queue.enqueue('Jack')
// alert(queue.toString());
// queue.enqueue('Camila');
// alert(queue.toString());
// alert(queue.size());
// queue.dequeue()
// queue.dequeue()
// alert(queue.toString())
// 击鼓传花
function hotPotato(elementList, num) {
var queue = new Queue();
for (var i = 0; i < elementList.length; i++) {
queue.enqueue(elementList[i]);
}
while (elementList.length != 1) {
for (var i = 0; i < num; i++) {
queue.enqueue(queue.dequeue());
}
queue.dequeue();
elementList.length--;
}
return queue.peek();
}
var List = ['John', 'Jack', 'Camila', 'Ingrid', 'Carl'];
alert(hotPotato(List, 7));