《学习javascript数据结构与算法》——第四章:队列

队列是遵循先进先出(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
posted @ 2016-03-24 11:10  u14e  阅读(184)  评论(0编辑  收藏  举报