队列也是一种受限的线性结构,只允许在表的前端删除,在表的后端插入

创建队列

虽然可以基于数组来创建队列,但是基于对象的队列效率更高,因为我们选择基于对象来创建队列。
队列需要一个lowetCount来跟踪现在最小的队列序号,且count不应该随着元素删除而减小,不然在插入元素时无法得知最后一个序号的大小。

  1. class Queue {
  2. constructor() {
  3. this.item = {};
  4. this.count = 0;
  5. this.lowestCount = 1;
  6. }
  7. enqueue(ele) {
  8. this.count += 1;
  9. this.item[this.count] = ele;
  10. }
  11. dequeue() {
  12. if(this.isEmpty()) {
  13. return undefined;
  14. }
  15. const res = this.item[this.lowestCount];
  16. delete this.item[this.lowestCount];
  17. this.lowestCount += 1;
  18. return res;
  19. }
  20. peek() {
  21. if(this.isEmpty()) {
  22. return undefined;
  23. }
  24. return this.item[this.lowestCount];
  25. }
  26. isEmpty() {
  27. return this.size() === 0;
  28. }
  29. size() {
  30. return this.count + 1 - this.lowestCount;
  31. }
  32. toString() {
  33. if(this.isEmpty()) {
  34. return '';
  35. }
  36. let str = '';
  37. for(const k in this.item) {
  38. str = str?`${str},${this.item[k]}`:this.item[k];
  39. }
  40. return str;
  41. }
  42. }
  43. const queue = new Queue();
  44. console.log(queue.isEmpty()); // 输出true
  45. queue.enqueue('John');
  46. queue.enqueue('Jack');
  47. console.log(queue.toString()); // John,Jack
  48. queue.enqueue('Camila');
  49. console.log(queue.toString()); // John, Jack, Camila
  50. console.log(queue.size()); // 输出3
  51. console.log(queue.isEmpty()); // 输出false
  52. queue.dequeue(); // 移除John
  53. queue.dequeue(); // 移除Jack
  54. console.log(queue.toString()); // Camila

双端队列

前后均可添加或者删除。
操作方法,addFront(element)addBack(element)removeFront``()removeBack()peekFront()peekBack()

击鼓传花问题

核心是将队列的第一个人丢到队列末尾去

  1. function hotPotato(names, number) {
  2. const queue = new Queue();
  3. let outNames = [];
  4. names.forEach((item) => {
  5. queue.enqueue(item);
  6. });
  7. while (queue.size() > 1) {
  8. for (let i = 0; i < number; i++) {
  9. queue.enqueue(queue.dequeue());
  10. }
  11. outNames.push(queue.dequeue());
  12. }
  13. return {
  14. winner: queue.dequeue(),
  15. outNames: outNames,
  16. };
  17. }
  18. const names = ["John", "Jack", "Camila", "Ingrid", "Carl"];
  19. const result = hotPotato(names, 7);
  20. console.log(result);
  21. // { winner: 'John', outNames: [ 'Camila', 'Jack', 'Carl', 'Ingrid' ] }
  22. // 在我们的写法中,每次淘汰的是第八个人。

回文检查器

核心是使用双端队列取出队列队首和队尾的值进行比较