JavaScript优先队列与循环队列实现详解

作者:青柠时间:2026-10-22 09:35:29浏览:255

本文详细介绍JavaScript中优先队列与循环队列的实现方法。优先队列通过比较优先级值决定元素位置,支持最小与最大优先级策略;循环队列结合迭代移除与重排模拟击鼓传花游戏逻辑,最终确定胜利者。

本文通过具体实例解析JavaScript中的优先队列与循环队列数据结构,旨在为读者提供清晰的实现思路与参考代码。

优先队列的实现逻辑

优先队列

构建优先队列的核心在于设定优先级规则,并确保新元素能插入到符合其优先级排序的正确位置。

本例实现的是最小优先队列,即优先级数值较小的元素被视为高优先级,应置于队列前端。


//创建一个类来表示优先队列
function Priorityqueue(){
  var items=[];//保存队列里的元素
  function QueueEle(e,p){//元素节点,有两个属性
    this.element=e;//值
    this.priority=p;//优先级
  }
  this.enqueue=function(e,p){//添加一个元素到队列尾部
    var queueEle=new QueueEle(e,p);
    var added=false;
    //priority小的优先级高,优先级高的在队头
    if(this.isEmpty()){
      items.push(queueEle);
    }else{
      for(var i=0;i<items.length;i++){
        if(items[i].priority>queueEle.priority){
          items.splice(i,0,queueEle);
          added=true;
          break;
        }
      }
      if(!added){
        items.push(queueEle);
      }
    }
  }
  this.isEmpty=function(){
    return items.length==0;
  }
  this.dequeue=function(){
    return items.shift();
  }
  this.clear=function(){
    items=[];
  }
  this.print=function(){
    console.log(items);
  }
  this.mylength=function(){
    return items.length;
  }
}
var pqueue=new Priorityqueue();
pqueue.enqueue('a',2);
pqueue.enqueue('b',1);
pqueue.enqueue('c',2);
pqueue.enqueue('d',2);
pqueue.enqueue('e',1);
pqueue.print();
//[ QueueEle { element: 'b', priority: 1 },
// QueueEle { element: 'e', priority: 1 },
// QueueEle { element: 'a', priority: 2 },
// QueueEle { element: 'c', priority: 2 },
// QueueEle { element: 'd', priority: 2 } ]

运行结果:

优先队列的实现逻辑

元素入队逻辑如下:若队列为空,直接追加;否则遍历现有元素,寻找第一个优先级低于新元素的节点,将其插入该节点之前。对于优先级相同的元素,仍遵循先进先出(FIFO)原则保持原有顺序。

最大优先队列则相反,优先级数值较大的元素被置于队列前端。

循环队列与击鼓传花应用

循环队列

利用循环队列特性实现经典的击鼓传花游戏逻辑。


//创建一个类来表示队列
function Queue(){
  var items=[];//保存队列里的元素
  this.enqueue=function(e){//添加一个元素到队列尾部
    items.push(e);
  }
  this.dequeue=function(){//移除队列的第一项,并返回
    return items.shift();
  }
  this.front=function(){//返回队列的第一项
    return items[0];
  }
  this.isEmpty=function(){//如果队列中部包含任何元素,返回true,否则返回false
    return items.length==0;
  }
  this.mylength=function(){//返回队列包含的元素个数
    return items.length;
  }
  this.clear=function(){//清除队列中的元素
    items=[];
  }
  this.print=function(){//打印队列中的元素
    console.log(items);
  }
}
//击鼓传花
function hotPotato(namelist,num){
  var queue=new Queue();
  for(var i=0;i<namelist.length;i++){
    queue.enqueue(namelist[i]);
  }
  var eliminated='';
  while(queue.mylength()>1){
    for(i=0;i<num;i++){
      queue.enqueue(queue.dequeue());
    }
    eliminated=queue.dequeue();
    console.log("淘汰"+eliminated);
  }
  return queue.dequeue();
}
var namelist=['a','b','c','d','e'];
var winner=hotPotato(namelist,7);
console.log(winner+"获胜");
//淘汰c
//淘汰b
//淘汰e
//淘汰d
//a获胜

运行结果:

优先队列的实现逻辑

首先将名单中的所有姓名加入队列,并指定一个迭代计数。通过不断从队头移除元素并追加至队尾来模拟传递过程,当传递次数达到指定数值时,当前位于队头的元素被淘汰。重复此过程直至队列中仅剩一人,该人即为最终胜利者。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

作者最新文章