基本概念

优先队列是计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列往往用堆来实现。还是那句话,维基百科喜欢用概念解释概念,简而言之:正常的队列,插入一个元素,都会放到后端,优先级队列需要在插入元素的时候考虑这个数据的优先级,然后和别的元素比较优先级,最后得出这个元素在队列中正确的位置。

在js中实现优先级队列

  1. // 因为我们每个元素都是一个对象,要包含本身的值,还有他的优先级,所以定义一个构造函数
  2. function QueueElement(item, priority) {
  3. this._item = item;
  4. this.priority = priority;
  5. }
  6. function PriorityQueue() {
  7. this.items = [];
  8. }
  9. PriorityQueue.prototype.enqueue = function (element, priority) {
  10. let queueElement = new QueueElement(element, priority);
  11. if (this.items.length === 0) {
  12. this.items.push(queueElement);
  13. } else {
  14. let flag = false;
  15. for (let index = 0; index < this.items.length; index++) {
  16. if (queueElement.priority < this.items[index].priority) {
  17. this.items.splice(index, 0, queueElement);
  18. flag = true;
  19. break;
  20. }
  21. }
  22. if (!flag) {
  23. this.items.push(queueElement);
  24. }
  25. }
  26. };
  27. PriorityQueue.prototype.dequeue = function () {
  28. return this.items.shift();
  29. };
  30. PriorityQueue.prototype.front = function () {
  31. return this.items[0];
  32. };
  33. PriorityQueue.prototype.isEmpty = function () {
  34. return this.items.length > 0 ? false : true;
  35. };
  36. PriorityQueue.prototype.size = function () {
  37. return this.items.length;
  38. };
  39. PriorityQueue.prototype.toString = function () {
  40. let str = "";
  41. this.items.forEach(item => {
  42. str = str + item.priority + "-" + item._item + " ";
  43. });
  44. return str;
  45. };
  46. const p1 = new PriorityQueue();
  47. p1.enqueue(5, 5);
  48. p1.enqueue(4, 4);
  49. p1.enqueue(3, 3);
  50. p1.enqueue(2, 2);
  51. p1.enqueue(1, 1);
  52. p1.enqueue(100, 100);
  53. p1.enqueue(0, 0);
  54. console.log(p1.toString());
  1. 我们在插入元素的时候需要指定当前元素的值还有他的优先级,所以我们生命一个构造函数。
  2. 然后分三种情况
    • 第一种情况,第一次插入的时候就没必要比较的,直接插入即可
    • 第二种情况,items里面有元素,我们需要根据当前元素的优先级来插入这个元素
    • 第三种情况,items元素遍历完了都没找到,说明他应该插入最后端,那么我们就直接push进去就完事了