概念

队列是遵循先进先出(FIFO)原则的一组有序的项。队列在尾部添加新的元素,并从顶部移除元素。

队列实现

普通队列

  1. function Queue() {
  2. let items = [];
  3. // 相对列添加新的元素
  4. this.enqueue = function(element) {
  5. items.push(element);
  6. }
  7. // 从队列移除元素
  8. this.dequeue = function() {
  9. return items.shift();
  10. }
  11. // 查看队列头元素
  12. this.front = function() {
  13. return items[0];
  14. }
  15. // 检查队列是否为空
  16. this.isEmpty = function() {
  17. return items.length == 0;
  18. }
  19. // 打印队列元素
  20. this.print = function() {
  21. console.log(items.toString());
  22. }
  23. // 队列的长度
  24. this.size = function() {
  25. return items.length;
  26. }
  27. }

优先队列

  1. function PriorityQueue() {
  2. let items = [];
  3. function QueueItem(ele, priority) {
  4. this.element = ele;
  5. this.priority = priority;
  6. }
  7. // 入队 要考虑优先级
  8. this.enqueue = function (ele, priority) {
  9. let queueItem = new QueueItem(ele, priority);
  10. let added = false;
  11. for (let i = 0; i < items.length; i++) {
  12. if (queueItem.priority < items[i].priority) {
  13. items.splice(i, 0, queueItem);
  14. added = true;
  15. break;
  16. }
  17. }
  18. if (!added) {
  19. items.push(queueItem);
  20. }
  21. };
  22. this.print = function () {
  23. for (let i = 0; i < items.length; i++) {
  24. console.log(`${items[i].element} - ${items[i].priority}`)
  25. }
  26. };
  27. // 其他的方法,逻辑和普通队列相同
  28. }
  29. // 注:优先级 1 > 2
  30. let priorityQueue = new PriorityQueue();
  31. priorityQueue.enqueue("John", 2);
  32. priorityQueue.enqueue("Jack", 1);
  33. priorityQueue.enqueue("Camila", 1);
  34. priorityQueue.print();

循环队列

  1. // 击鼓传花游戏
  2. function hotPotato(nameList, num) {
  3. let queue = new Queue();
  4. for (let i=0; i<nameList.length; i++) {
  5. queue.enqueue(nameList[i]);
  6. }
  7. let eliminated = '';
  8. while(queue.size() > 1) {
  9. for (let i=0; i<num; i++) {
  10. // 将队列首尾进行连接
  11. queue.enqueue(queue.dequeue());
  12. }
  13. eliminated = queue.dequeue();
  14. console.log(eliminated + '被淘汰。');
  15. }
  16. return queue.dequeue();
  17. }
  18. let names = ['John','Jack','Camila','Ingrid','Carl'];
  19. let winner = hotPotato(names, 7);
  20. console.log(winner) // 输出:John