javascript數據結構之隊列

隊列的操做方式和堆棧相似,惟一的區別在於隊列只容許新數據在後端進行添加。這就跟排隊買包子同樣,你先來就先買,後來就排隊等待,這個就頗有紀律性,不會出現有人插隊的壞現象了。javascript

首先說一下隊列的經常使用操做:java

Queue()     // 建立一個空的隊列對象
enqueue()   // 入隊操做,將元素放置隊尾
dequeue()   // 出隊操做,將隊首的元素移除隊列並返回
front()     // 返回隊首元素,不對隊列作操做
isEmpty()   // 判斷隊列是否爲空
size()      // 返回隊列內元素的個數
clear()     // 清空隊列

使用javascript模擬隊列的實現:後端

function Queue () {
  let 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.size = function () {
    // 返回隊列裏元素的個數
    return items.length
  }
  this.clear = function () {
    // 移除隊列裏全部的元素
    items = []
  }
  this.print = function () {
    console.log(items.toString())
  }
  this.toString = function () {
    return items.toString()
  }
}

簡單的隊列就實現了,那麼來講說優先隊列,在開始說了,這是一個有紀律的隊列,可是呢,也是會有特殊狀況的,好比說在醫院排隊看病,這時來了個快要生的孕婦,總不能讓人家也跟在後面排隊吧,這時孕婦就有了優先權,能夠更快的處理。那麼怎麼用javascript來實現呢,首先得給加入隊列的元素一個標誌,標誌這個元素的優先級:dom

function QueueElement (element, key) {
    this.element = element
    this.key = key
}

在加入隊列時也要給一個標誌,根據標誌插入到隊列中:this

this.enqueue = function (element, key) {
    let queueElement = new QueueElement(element, key)
    if (this.isEmpty()) {
      items.push(queueElement)
    } else {
      let added = false
      for (let i = 0; i < items.length; i++) {
        if (items[i].key > key) {
          items.splice(i, 0, queueElement)
          added = true
          break
        }
      }
      if (!added) {
        items.push(queueElement)
      }
    }
  }

其餘的都與普通隊列同樣,具體代碼以下:code

function PriorityQueue () {
  let items = []
  function QueueElement (element, key) {
    this.element = element
    this.key = key
  }
  this.enqueue = function (element, key) {
    let queueElement = new QueueElement(element, key)
    if (this.isEmpty()) {
      items.push(queueElement)
    } else {
      let added = false
      for (let i = 0; i < items.length; i++) {
        if (items[i].key > key) {
          items.splice(i, 0, queueElement)
          added = true
          break
        }
      }
      if (!added) {
        items.push(queueElement)
      }
    }
  }
  this.dequeue = function () {
    return items.shift()
  }
  this.front = function () {
    return items[0]
  }
  this.isEmpty = function () {
    return items.length === 0
  }
  this.size = function () {
    // 返回隊列裏元素的個數
    return items.length
  }
  this.clear = function () {
    // 移除隊列裏全部的元素
    items = []
  }
  this.print = function () {
    console.log(items.toString())
  }
  this.toString = function () {
    return items.toString()
  }
}

一道小題

擊鼓傳花遊戲,在這個遊戲中,孩子們圍成一個圓圈,把花盡快的傳遞給旁邊的人。某一時刻傳花中止,這個時候花落在誰手裏,誰就退出圓圈結束遊戲。重複這個過程,直到只剩下一個孩子。對象

解答:隊列

function hotPotato (nameList) {
  let childrenQueue = new Queue()
  for(let i = 0; i < nameList.length; i++) {
    childrenQueue.enqueue(nameList[i])
  }
  while (childrenQueue.size() > 1) {
    let ring = Math.round(Math.random() * childrenQueue.size() * 2 + childrenQueue.size())
    for(let i = 0; i < ring; i++) {
      let out = childrenQueue.dequeue()
      childrenQueue.enqueue(out)
      // 將出隊的元素再放入隊尾,構成循環隊列
      let ring = Math.round(Math.random() * childrenQueue.size() * 2 + childrenQueue.size())
      // 隨機淘汰參賽者
    }
    console.log(childrenQueue.dequeue() + ' is out')
    // childrenQueue.dequeue()
  }
  console.log(childrenQueue.dequeue() + ' is winner')
}

hotPotato(['lili', 'aki', 'xiao', 'long', 'yuw', 'ray', 'wiess'])
相關文章
相關標籤/搜索