之前我们已经实现了一个Queue的构造函数。这里使用它来模拟一个击鼓传花的游戏。
function hotPotato(name_list, num) {
var queue = new Queue();
for(var i=0; i<name_list.length; ++i) {
queue.enqueue(name_list[i]);
}
var eliminated = "";
var round = 1;
while(queue.size() > 1) {
for(var i=0; i<num; ++i) {
queue.enqueue(queue.dequeue());
}
elimated = queue.dequeue();
console.log("Round " + (round++) + ": " + elimated);
}
return queue.dequeue();
}
var name_list = ["Fiona", "Leon", "Jerry", "Susan", "Orianna", "Amumu"];
console.log("The winner is " + hotPotato(name_list,2));
输出结果:
对于这个问题,使用队列的结构很清晰。同样的,我们仍然可以只用数组来模拟这个过程。
只需要进行一个取余运算就可以完成循环遍历队列的问题
function hotPotatoUseArray(name_list, num) {
var current_index = 0;
var eliminated = "";
while(name_list.length > 1) {
current_index = (current_index +num) % name_list.length;
eliminated = name_list.splice(current_index, 1);
console.log("eliminated: " + eliminated);
}
return name_list[0];
}
var name_list = ["Fiona", "Leon", "Jerry", "Susan", "Orianna", "Amumu"];
console.log("The winner is " + hotPotatoUseArray(name_list, 2));
输出结果与上面是一致的