zoukankan      html  css  js  c++  java
  • 《学习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
  • 相关阅读:
    JavaSE-集合的遍历
    JavaSE-Collection常用方法
    JavaSE-异常
    JavaSE-匿名类_匿名内部类的使用
    JavaSE-内部类
    JavaSE-接口应用举例
    java线程的使用(Runnable)
    list根据所存对象属性排序
    Unable to locate appropriate constructor on class异常
    redis在java项目中的使用
  • 原文地址:https://www.cnblogs.com/u14e/p/5314682.html
Copyright © 2011-2022 走看看