队列是遵循先进先出(FIFO)原则的一组有序的项
队列在尾部添加新元素,并从顶部移除元素
创建队列,并声明方法
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());
};
}
类似上一章栈的创建与声明
优先队列
设置优先级,然后再正确的位置添加元素
function PriorityQueue() {
var items = [];
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
this.isEmpty = function() {
return items.length === 0;
};
this.enqueue = function(element, priority) {
var queueElement = new QueueElement(element, priority);
if (this.isEmpty()) {
items.push(queueElement);
} else {
var added = false;
for (var i = 0; i < items.length; i++) {
if (queueElement.priority < items[i].priority) {
items.splice(i, 0, queueElement);
added = true;
break;
}
}
if (!added) {
items.push(queueElement);
}
}
};
this.print = function() {
for (var i = 0; i < items.length; i++) {
console.log(items[i].element + "-" + items[i].priority);
}
};
}
var priorityQueue = new PriorityQueue();
priorityQueue.enqueue("john", 2);
priorityQueue.enqueue("jack", 1);
priorityQueue.enqueue("camila", 1);
priorityQueue.enqueue("Maxwell", 2);
priorityQueue.enqueue("Ana", 3);
priorityQueue.print();
//jack-1,camila-1,john-2,Maxwell-2,Ana-3
- 首先创建一个元素queueElement,该元素包含要添加到队列中的元素和其在队列中的优先级
- 如果队列为空,直接将元素入列
- 否则比较该元素与队列中的元素的priority值(值越大,优先级越小)
- 找到一个priority值大于它的项,就把它插入其前面,停止循环
- 如果该元素的priority值大于或等于队列中的所有元素,则把它添加到队列末尾
循环队列——击鼓传花
几个孩子围城一圈,把花尽快传递给旁边的人,某一时刻传花停止,这个时候花落在谁手上,谁就退出圆圈,继续传花,如此循环,直至只剩下一个孩子,即胜者
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) {
for (var i = 0; i < num; i++) {
queue.enqueue(queue.dequeue());
}
eliminated = queue.dequeue();
console.log(eliminated + "在击鼓传花游戏中被淘汰");
}
return queue.dequeue();
}
var names = ['john', 'jack', 'camila', 'ingrid', 'carl'];
var winner = hotPotato(names, 7);
console.log("胜利者: " + winner); //john
- 先把名单添加到队列
- 给定一个数字,然后迭代队列。队列从头移除一项,再将其添加到队列末尾
- 一旦传递次数达到给定的数字,则删除此时的队列第一项(即拿着花的那个人)
- 再迭代新的队列,如此循环,直至队列只剩下一项(即胜者)
控制台输出:
- camila在击鼓传花游戏中被淘汰
- jack在击鼓传花游戏中被淘汰
- carl在击鼓传花游戏中被淘汰
- ingrid在击鼓传花游戏中被淘汰
- 胜利者: john