队列,与栈类似,只是队列遵循的是 先进先出(FIFO) 原则的有序的项。也就是先来后到。
现实生活中最典型的就是 排队 这个例子,先排先处理。

1571058306-df3b12f60dd48ed.gif

队列的实现

  1. class Queue {
  2. constructor() {
  3. this.count = 0;
  4. this.lowestCount = 0;
  5. this.items = {};
  6. }
  7. /**
  8. * 向队尾添加新的项
  9. * @param {*} element
  10. */
  11. enqueue(element) {
  12. this.items[this.count] = element;
  13. this.count++;
  14. }
  15. /**
  16. * 移除队列第一项
  17. */
  18. dequeue() {
  19. if (this.isEmpty()) {
  20. return;
  21. }
  22. let element = this.items[this.lowestCount];
  23. delete this.items[this.lowestCount];
  24. this.lowestCount++;
  25. return element;
  26. }
  27. /**
  28. * 返回队列第一项
  29. */
  30. peek() {
  31. return this.isEmpty() ? null : this.items[this.lowestCount];
  32. }
  33. isEmpty() {
  34. return this.size() === 0;
  35. }
  36. size() {
  37. return this.count - this.lowestCount;
  38. }
  39. clear() {
  40. this.count = 0;
  41. this.lowestCount = 0;
  42. this.items = {};
  43. }
  44. toString() {
  45. if (this.isEmpty()) {
  46. return '';
  47. }
  48. let str = this.items[this.lowestCount].toString();
  49. for (let i = this.lowestCount + 1; i < this.count; i++) {
  50. str += `,${this.items[i]}`;
  51. }
  52. return str;
  53. }
  54. }

队列的应用

击鼓传花

  1. function hotPotato(list, num) {
  2. let queue = new Queue();
  3. let dies = [];
  4. for (let i = 0; i < list.length; i++) {
  5. queue.enqueue(list[i]);
  6. }
  7. while (queue.size() > 1) {
  8. for (let i = 0; i < num; i++) {
  9. queue.enqueue(queue.dequeue());
  10. }
  11. dies.push(queue.dequeue());
  12. }
  13. return {
  14. dies,
  15. winner: queue.peek()
  16. }
  17. }
  18. const names = ['John', 'Jack', 'Camila', 'Ingrid', 'Carl'];
  19. const result = hotPotato(names, 5);
  20. result.dies.forEach(name => {
  21. console.log(`${name}在击鼓传花游戏中被淘汰。`);
  22. });
  23. console.log(`胜利者: ${result.winner}`);
  24. /*
  25. John在击鼓传花游戏中被淘汰。
  26. Camila在击鼓传花游戏中被淘汰。
  27. Jack在击鼓传花游戏中被淘汰。
  28. Carl在击鼓传花游戏中被淘汰。
  29. 胜利者: Ingrid
  30. */