(一)什么是优先队列
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。
比如:医院急诊室,医生会根据患者的病情严重程度,给患者一个优先级码,当医生空闲时,候诊区优先级最高的患者最先就诊
队列出栈时,优先级高的先与优先级低的
同样优先级的,按照入栈顺序出栈
(二)代码实现优先队列
与队列不同的是,每一各元素需要一个code优先级码
// 定义每个元素 class Patient { constructor (value, code) { this.value = value this.code = code // 最小值0 } } class Quence { constructor () { this.QuentList = [] } // 入列 enquence (patient) { this.QuentList.push(patient) } // 出列 code 码越高优先级越大 先出列 dequence () { // 遍历找到code最大的一项 var current = 0 for (var i = 0; i < this.QuentList.length; i++) { if (this.QuentList[i].code > this.QuentList[current].code) { current = i } } this.QuentList.splice(current, 1) // code最大项出栈 } getQuent () { return this.QuentList } } var queue = new Quence() queue.enquence(new Patient('lily', 4)) queue.enquence(new Patient('bob', 5)) queue.enquence(new Patient('lucy', 8)) queue.enquence(new Patient('hibby', 8)) queue.dequence() console.log(queue.getQuent())(三)双向队列
允许队列从两端添加、删除元素
pop、push、unshift、shift
(四)代码实现
function Queue(){ this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueueBack = enqueueBack; this.dequeueFront = dequeueFront; this.dequeueBack = dequeueBack; this.front = front; this.back = back; this.toString = toString; this.empty = empty; } //尾部入队,就是在数组的末尾添加一个元素 function enqueueBack(element){ this.dataStore.push(element); } //头部入队,就是在数组的头部添加一个元素 function enqueueFront(element){ this.dataStore.splice(0,0,element); } //尾部出队,就是删除数组的最后一个元素 function dequeueBack(){ return this.dataStore.splice(this.dataStore.length-1, 1); } //出队,就是删除数组的第一个元素 function dequeueFront(){ return this.dataStore.shift(); } //取出数组的第一个元素 function front(){ return this.dataStore[0]; } //取出数组的最后一个元素 function back(){ return this.dataStore[this.dataStore.length-1]; } function toString(){ var retStr = ""; for (var i=0; i<this.dataStore.length; ++i) { retStr += this.dataStore[i] + " " } return retStr; } //判断数组是否为空 function empty(){ if(this.dataStore.length == 0){ return true; }else{ return false; } } //返回数组中元素的个数 function count(){ return this.dataStore.length; } var q = new Queue(); q.enqueueFront("1"); q.enqueueFront("2"); q.enqueueBack("3"); q.enqueueBack("4"); document.write(q.toString()); document.write('<br>'); q.dequeueFront(); document.write(q.toString()); document.write('<br>'); q.dequeueBack(); document.write(q.toString()); document.write('<br>'); document.write('<br>');