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