概念
队列是遵循先进先出(FIFO)原则的一组有序的项。队列在尾部添加新的元素,并从顶部移除元素。
队列实现
普通队列
function Queue() {let 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.print = function() {console.log(items.toString());}// 队列的长度this.size = function() {return items.length;}}
优先队列
function PriorityQueue() {let items = [];function QueueItem(ele, priority) {this.element = ele;this.priority = priority;}// 入队 要考虑优先级this.enqueue = function (ele, priority) {let queueItem = new QueueItem(ele, priority);let added = false;for (let i = 0; i < items.length; i++) {if (queueItem.priority < items[i].priority) {items.splice(i, 0, queueItem);added = true;break;}}if (!added) {items.push(queueItem);}};this.print = function () {for (let i = 0; i < items.length; i++) {console.log(`${items[i].element} - ${items[i].priority}`)}};// 其他的方法,逻辑和普通队列相同}// 注:优先级 1 > 2let priorityQueue = new PriorityQueue();priorityQueue.enqueue("John", 2);priorityQueue.enqueue("Jack", 1);priorityQueue.enqueue("Camila", 1);priorityQueue.print();
循环队列
// 击鼓传花游戏function hotPotato(nameList, num) {let queue = new Queue();for (let i=0; i<nameList.length; i++) {queue.enqueue(nameList[i]);}let eliminated = '';while(queue.size() > 1) {for (let i=0; i<num; i++) {// 将队列首尾进行连接queue.enqueue(queue.dequeue());}eliminated = queue.dequeue();console.log(eliminated + '被淘汰。');}return queue.dequeue();}let names = ['John','Jack','Camila','Ingrid','Carl'];let winner = hotPotato(names, 7);console.log(winner) // 输出:John
