循环队列,听名字就知道意思了,而实现的时候并不是真正将头和尾相连接,而是通过删除队首,再将删除的元素放在队尾实现。
这里的击鼓串花:每次循环删除掉一个元素,最终留下的为胜利者。 相关文章
JavaScript 数组 JavaScript 队列 JavaScript 优先队列
function Queue(){//定义队列对象
var items = [];//队列的承载
//向队列尾部添加一个或多个新的项
this.enqueue = function(el){
items.push(el)
}
//删除队列头部第一个元素
this.dequeue = function(){
return items.shift();
}
//返回队列中第一个元素
this.front = function(){
return items[0];
}
//确定元素是否为空 为空则为true 不为空则为false
this.isEmpty = function(){
return items.length === 0;
}
//返回队列长度
this.size = function(){
return items.length;
}
//打印队列
this.print = function(){
console.log(items.toString())
}
}
function hotPotato (nameList, num){
var queue = new Queue();
for(var i = 0;i<nameList.length;i++){
queue.enqueue(nameList[i]);
//把名单全部加入到队列
}
var eliminated = '';
while (queue.size()>1){
//第一次队列:[John,JAck,Camila,Ingrid,Carl]
//第二次队列:[ingrid,carl,john,jack]
//第三次队列:[ingrid,carl,john]
//第四次队列:[john,ingrid]
for(var i = 0;i<num;i++){
queue.enqueue(queue.dequeue());
//删除队首元素->返回被删除的元素->放到队尾
//这一步就实现了循环队列的实质
}
//for循环之后的队列
//第一次:[amila,ingrid,carl,john,Jack]
//第二次:[jack,ingrid,carl,john]
//第三次:[carl,john,ingrid]
//第四次:[ingrid,john]
//接下来进行的就是击鼓传花了
eliminated = queue.dequeue();
//删除队首,击鼓传花中,被淘汰掉了
//每次淘汰一个:淘汰顺序:
//camila->jack->carl->ingrid
console.log(eliminated + '在击鼓传花游戏中被淘汰');
}
return queue.dequeue();
//胜出者 --》john
}
var names = ['John','JAck','Camila','Ingrid','Carl'];
var winner = hotPotato(names,7);
//这里的击鼓串花的间隔是相同的,可以根据实际项目需求,在hotPotato()中定义相应方法去生成
console.log('胜利者:'+ winner);
相关文章
JavaScript 数组
JavaScript 队列
JavaScript 优先队列
我的微信公众平台 不喜勿喷