利用数组实现优先级队列

1,132 阅读3分钟

~嗷嗷待哺的小拉机永远接受您的指教与批评!

叙:

1.队列的特点

FIFO(先进先出)

2.优先级说明

队列中的元素除了我们需要用到的“显式”属性之外,还有一个“隐式”属性去限制元素排列的顺序,这个“隐式”属性我们可以把它理解为优先级;例如,26个英文字母在字母表中的出现顺序,a在最前面,z在最后面,可以理解为a的优先级高于z的优先级,并且a的优先级在字母表中的优先级是最高的

3.优先级队列应用

微信||QQ消息,新消息会出现在列表的最上端,也就是优先级较高,置顶操作也是通过设置列表元素的优先级实现

4.需求分析与实现

参考数据:
  { value: "马化腾", priority: 1 },
  { value: "马云", priority: 2 },
  { value: "巴菲克", priority: 3 },
  { value: "扎克伯格", priority: 4 },
  { value: "比尔盖茨", priority: 5 },
  { value: "Bakari1", priority: 6 },
  { value: "Bakari2", priority: 7 },
  { value: "Bakari3", priority: 8 },
  { value: "Bakari4", priority: 9 },
  { value: "Bakari5", priority: 10 },
  { value: "Bakari6", priority: 11 },
  • 首先根据数组实现队列的基本功能-FIFO
  • 将第一个数据加入队列,先判断队列是否为空,如果为空则不需要判断优先级,直接入列:

  • 如果队列不为空,则判断即将入列的元素的优先级是否高于队首元素或者低于队尾元素,高于队首元素则直接从队首入列,低于队尾元素则直接从队尾入列,不必循环比较队列中的每一个元素:

  • 否则,最终再选择依次比较队列中的每一个元素(本打算剩下的部分采用二分法比较,但是实际开发中发现更加繁琐,故放弃):

  • 最终实现:

5.完整代码

const Queue = class {
  constructor() {
    this.dataStore = []
  }
  //从队尾入列 
  enFootQueue(element) {
    this.dataStore.push(element)
  }
  //从队首入列
  enHeadQueue(element) {
    this.dataStore.unshift(element)
  }
  //从任意位置入列
  spliceQueue(i, j, element) {
    this.dataStore.splice(i, j, element)
  }
  //出列 
  deQueue() {
    this.dataStore.shift()
  }
  //获取队首元素
  getFront() {
    return this.dataStore[0]
  }
  //获取队尾元素
  getEnd() {
    return this.dataStore[this.dataStore.length - 1]
  }
  //获取队列所有元素
  getQueue() {
    return this.dataStore
  }
  //判断队列是否为空
  isEmpty() {
    return this.dataStore.length == 0
  }
}
var elementItem = [
  { value: "马化腾", priority: 1 },
  { value: "马云", priority: 2 },
  { value: "巴菲克", priority: 3 },
  { value: "扎克伯格", priority: 4 },
  { value: "比尔盖茨", priority: 5 },
  { value: "Bakari1", priority: 6 },
  { value: "Bakari2", priority: 7 },
  { value: "Bakari3", priority: 8 },
  { value: "Bakari4", priority: 9 },
  { value: "Bakari5", priority: 10 },
  { value: "Bakari6", priority: 11 },
]
var queue = new Queue()
function priorityQueue(el) {
  if (queue.isEmpty()) {
    queue.enFootQueue(el)
  } else if (el.priority > queue.getFront().priority) {
    //如果插入元素的优先级高于队首元素,说明该元素优先级是最高的,直接从队首入列即可
    queue.enHeadQueue(el)
  } else if (el.priority < queue.getEnd().priority) {
    //如果插入元素的优先级低于队尾元素,说明该元素优先级是最低的,直接从队尾入列即可
    queue.enFootQueue(el)
  } else {
    //逐项比较,首尾已过滤,不用比较
    let len = queue.getQueue().length
    for (let i = 1; i < len; i++) {
      if (el.priority > queue.getQueue()[i].priority) {
        queue.spliceQueue(i, 0, el)
        break
      }
    }
  }
}

priorityQueue(elementItem[3])
priorityQueue(elementItem[2])
priorityQueue(elementItem[4])
priorityQueue(elementItem[9])
priorityQueue(elementItem[8])
priorityQueue(elementItem[0])
priorityQueue(elementItem[7])
priorityQueue(elementItem[1])
priorityQueue(elementItem[10])
priorityQueue(elementItem[6])
priorityQueue(elementItem[5])
console.log(queue.getQueue())
},