js封装数据结构_03_优先级队列

优先级队列是不同于”先进先出“的队列,可以查看和取出优先级最高的元素;

优先级是数字越小优先级越高;

这里实现了:

  • enqueue,插入元素;
  • dequeue,删除优先级最高的元素;

  • front,查看优先级最高的元素;

  • isEmpty,是否为空;

  • toString,重写toString();

这里讲一下最难的enqueue的实现:

先封装一个类中类,用于存放元素以及对应的优先级

  // 类中类
  function QueueElement(element, priority) {
    this.element = element;
    this.priority = priority;
  }

插入分为三种情况:队列为空、有优先级比插入元素低的、没有优先级比插入元素低的:

PriorityQueue.prototype.enqueue = function (element, priority) {
    // 1.创建queueElement对象
    var queueElement = new QueueElement(element, priority);
    // 2.判断队列是否为空,第一种为空直接添加
    if (this.items.length === 0) {
      this.items.push(queueElement);
    } else {
      var added = false;
      // 第二种,有优先级比自己低的,插入它前面
      for (let i = 0; i < this.items.length; i++) {
        if (queueElement.priority < this.items[i].priority) {
          this.items.splice(i, 0, queueElement);
          added = true;
          break;
        }
      }
      // 第三种,比较完都没有优先级比自己低的,那就在末尾插入
      if (!added) {
        this.items.push(queueElement);
      }
    }
  };

完整代码:

function PriorityQueue() {
  // 类中类
  function QueueElement(element, priority) {
    this.element = element;
    this.priority = priority;
  }
  // 封装属性
  this.items = [];
  // 1.实现插入元素
  PriorityQueue.prototype.enqueue = function (element, priority) {
    // 1.创建queueElement对象
    var queueElement = new QueueElement(element, priority);
    // 2.判断队列是否为空,第一种为空直接添加
    if (this.items.length === 0) {
      this.items.push(queueElement);
    } else {
      var added = false;
      // 第二种,有优先级比自己低的,插入它前面
      for (let i = 0; i < this.items.length; i++) {
        if (queueElement.priority < this.items[i].priority) {
          this.items.splice(i, 0, queueElement);
          added = true;
          break;
        }
      }
      // 第三种,比较完都没有优先级比自己低的,那就在末尾插入
      if (!added) {
        this.items.push(queueElement);
      }
    }
  };

  // 2.从队列中删除前端元素
  PriorityQueue.prototype.dequeue = function () {
    return this.items.shift();
  };
  // 3.查看前端元素
  PriorityQueue.prototype.front = function () {
    return this.items[0];
  };

  // 4.查看队列是否为空
  PriorityQueue.prototype.isEmpty = function () {
    return this.items.length == 0;
  };
  // 5.查看队列中元素的个数
  PriorityQueue.prototype.size = function () {
    return this.items.length;
  };
  // 6.toString方法的实现
  PriorityQueue.prototype.toString = function () {
    let resultString = "";
    for (let i = 0; i < this.items.length; i++) {
      resultString +=
        this.items[i].element + "-" + this.items[i].priority + " ";
    }
    return resultString;
  };
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值