队列
先进先出, 类似排队,数组实现
function Queue() {
var items = [];
//向尾部添加
this.enqueue = function(element) {
items.push(element);
}
//出队列 删除第一个 并返回第一个元素的值
this.dequeue = function() {
return items.shift();
}
//下一个 返回第一个
this.front = function() {
return items[0];
}
//是否为空
this.isEmpty = function() {
return items.length === 0;
}
//清空队列
this.clear = function() {
items = [];
}
//队列长度
this.size = function() {
return items.length;
}
this.print = function() {
console.log(items.toString());
}
}
1、优先队列:
要改变的是 添加元素时,要考虑权重,如下权重小的在前
function PriorityQueue() {
var items = [];
// {1}
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
this.enqueue = function(element, priority) {
var queueElement = new QueueElement(element, priority);
if(this.isEmpty()) {//空队列直接插入
items.push(queueElement); // {2}
} else {
var added = false;
for(var i = 0; i < items.length; i++) {//从前往后找一个比自己权重大的
if(queueElement.priority < items.[i].priority) {
items.splice(i, 0, queueElement); // {3}
added = true;
break;
}
}
if(!added) { // {4}
items.push(queueElement);
}
}
}
// 其他方法与默认队列一样
}
2、循环队列:
几个孩子围成一圈,开始击鼓了,孩子就把花尽快地传递给旁边的人,某一时刻鼓声停止了,传花也就停止了,这个时候花落在谁手上,谁就被淘汰。鼓声响起,继续传花,如此循环,直至只剩下一个孩子,即胜者。
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) { // 当队列的的长度大于1的时候(行{2}),
for (var i = 0; i < num; i++) {
queue.enqueue(queue.dequeue()); // 根据num迭代队列,将队列头移除并添加到队尾。
}
eliminated = queue.dequeue(); // 传递次数达到给定的数字,则删除此时的队列第一项
console.log(eliminated + "在击鼓传花游戏中被淘汰");
}
return queue.dequeue(); // 如此循环,直至队列的长度等于1,返回胜者
}
var names = ['john', 'jack', 'camila', 'ingrid', 'carl'];
var winner = hotPotato(names, 7);
console.log("胜利者: " + winner); //john