首頁  >  文章  >  web前端  >  JavaScript資料結構中優先隊列與循環隊列

JavaScript資料結構中優先隊列與循環隊列

黄舟
黄舟原創
2017-10-28 09:23:521706瀏覽

本文實例敘述了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(&#39;a&#39;,2);
pqueue.enqueue(&#39;b&#39;,1);
pqueue.enqueue(&#39;c&#39;,2);
pqueue.enqueue(&#39;d&#39;,2);
pqueue.enqueue(&#39;e&#39;,1);
pqueue.print();
//[ QueueEle { element: &#39;b&#39;, priority: 1 },
// QueueEle { element: &#39;e&#39;, priority: 1 },
// QueueEle { element: &#39;a&#39;, priority: 2 },
// QueueEle { element: &#39;c&#39;, priority: 2 },
// QueueEle { element: &#39;d&#39;, priority: 2 } ]

執行結果:

在正確的位置新增元素:如果佇列為空,可以直接將元素入列。否則,就需要比較該元素與其他元素的優先順序。當找到一個比要新增的元素優先權更低的項時,就把新元素插入到它之前,這樣,對於其他優先權相同,但是先加入到佇列的元素,我們同樣遵循先進先出的原則。

最大優先權佇列:優先權的值大的元素放置在佇列前面。

循環佇列

實作擊鼓傳花遊戲。

//创建一个类来表示队列
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=&#39;&#39;;
  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=[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;];
var winner=hotPotato(namelist,7);
console.log(winner+"获胜");
//淘汰c
//淘汰b
//淘汰e
//淘汰d
//a获胜

運行結果:

得到一份名單,把裡面的名字全都加入隊列。給定一個數字,然後迭代隊列。從佇列頭移除一項,加入到佇列尾部,模擬循環佇列。一旦傳遞次數達到給定的數字,拿到花的人就會被淘汰。最後只剩一個人的時候,他就是勝利者。

以上是JavaScript資料結構中優先隊列與循環隊列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn