JS數(shù)據(jù)結(jié)構(gòu)與算法-隊(duì)列

  1. 定義

隊(duì)列是遵循FIFO(First In First Out,先進(jìn)先出)原則的一組有序的項(xiàng)。

在現(xiàn)實(shí)中,最常見的隊(duì)列的例子就是排隊(duì):

來(lái)自《javascript數(shù)據(jù)結(jié)構(gòu)與算法》
  1. 創(chuàng)建隊(duì)列
  • 聲明類并聲明一個(gè)數(shù)組用于存儲(chǔ)隊(duì)列中元素的數(shù)據(jù)結(jié)構(gòu)。
function Queue() {
  var items = [];
  //這里是屬性和方法
}
  • 實(shí)現(xiàn)enqueue()方法,向隊(duì)列尾部添加數(shù)個(gè)新的項(xiàng)。
this.enqueue = function(element) {
  //用push方法,將元素添加到數(shù)組末尾
  items.push(element);
};
  • 實(shí)現(xiàn)dequeue()方法,移除隊(duì)的第一項(xiàng)(隊(duì)首),并返回被移除的元素。
this.dequeue = function() {
  //shift方法,移除數(shù)組中的第一項(xiàng)(索引為0)的元素
  return items.shift();
};
  • front()方法,返回隊(duì)列中的第一個(gè)元素,不改變隊(duì)列。
this.front = function() {
  return items.shift();
};
  • isEmpty()方法,如果隊(duì)列中不包含任何元素,返回true,否則返回false。
this.isEmpty = function() {
  return items.length == 0;
};
  • clear()方法,清空隊(duì)列元素
this.clear = function() {
  items = [];
};
  • size()方法,返回隊(duì)列包含的元素個(gè)數(shù)。
this.size = function(){
  return items.lenght;
};
  • 完整代碼如下
function Queue() {
  var items = [];

  this.enqueue = function(element) {
    items.push(element);
  };

  this.dequeue = function() {
    return items.shift();
  };

  this.front = function() {
    return items[0];
  };

  this.isEmpty = function() {
    return items.length == 0;
  };

  this.clear = function() {
    items = [];
  };

  this.size = function() {
    return items.length;
  };

  this.print = function() {
    console.log(items.toString());
  }
}

var queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);

queue.print(); // "1,2"
  1. 優(yōu)先隊(duì)列
    現(xiàn)實(shí)生活中也有優(yōu)先隊(duì)列,如頭等艙>商務(wù)艙>經(jīng)濟(jì)艙,接下來(lái)我們用代碼實(shí)現(xiàn)下優(yōu)先隊(duì)列。
function PriorityQueue() {
  //聲明一個(gè)items用于保存元素
  var items = [];

  //創(chuàng)建一個(gè)QueueElement類,用于保存元素和其在隊(duì)列中的優(yōu)先級(jí)(priority越小,優(yōu)先級(jí)越高)
  function QueueElement(element,priority) {
    this.element = element;
    this.priority = priority;
  }

  this.enqueue = function(element,priority) {
    var queueElement = new QueueElement(element,priority);
    //如果隊(duì)列為空,可以將元素入列
    if(this.isEmpty()) {
      items.push(queueElement);
    }else {
      var added = false;
      //反之就循環(huán)隊(duì)列里面的每一個(gè)元素,比較優(yōu)先級(jí),如果priority小(優(yōu)先級(jí)越高)的話,就用splice()方法放在該元素的前面
      for(var i=0; i<items.length; i++) {
        if(queueElement.priority < items[i].priority) {
          items.splice(i,0,queueElement);
          added = true;
          break;
        }
      }
      //如果添加的元素的priority比隊(duì)列中的每一個(gè)元素都要大的話,就把它添加到隊(duì)列的最后面
      if(!added) {
        items.push(queueElement);
      }
    }
  };

  this.isEmpty = function() {
    return items.length === 0;
  };

  this.print = function() {
    console.log(items);
  };
}

var priorityQueue = new PriorityQueue();
priorityQueue.enqueue("one",1);
priorityQueue.enqueue("two",2);
priorityQueue.enqueue("zero",0);
priorityQueue.enqueue("four",4);

priorityQueue.print(); // "0,1,2,4"
  1. 循環(huán)隊(duì)列
    循環(huán)隊(duì)列的一個(gè)例子就是擊鼓傳花游戲(HotPotato)。在這個(gè)游戲中,孩子們圍成一個(gè)圓圈,把花盡快地傳遞給旁邊的人。某一時(shí)刻傳花停止,這個(gè)時(shí)候花在誰(shuí)手里,誰(shuí)就退出圓圈結(jié)束游戲。重復(fù)這個(gè)過程,直到只剩一個(gè)孩子(勝者)。
function hotPotato(nameList,num) {
  var queue = new Queue();

  //將傳入的nameList遍歷,將每一項(xiàng)添加到隊(duì)列中
  for(var i=0; i<nameList; i++) {
    queue.enqueue(nameList[i]);
  }

  var eliminated = '';
  //如果隊(duì)列里的size大于1,就一直循環(huán)下去
  while(queue.size() > 1) {
    //將第一項(xiàng)放到最后一項(xiàng),循環(huán)給定的num
    for(var i=0; i<num; i++) {
      queue.enqueue(queue.dequeue);
    }
    //傳遞次數(shù)達(dá)到了給定的數(shù)值,(移除第一項(xiàng))
    eliminated = queue.dequeue();
    console.log(eliminated + '淘汰');
  }
  //返回隊(duì)列中僅有的最后一項(xiàng)
  return queue.dequeue();
}

var names = ['a','b','c','d','e'];
var winner = hotPotato(names,7);
console.log('勝利者' + winner);

參考學(xué)習(xí)

《javascript數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)》
《數(shù)據(jù)結(jié)構(gòu)與算法javascript描述》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容