數據結構與算法-隊列(Queue)

百度百科解釋:隊列是一種特殊的線性表,特殊之處在於它只容許在表的前端(front)進行刪除操做,而在表的後端(rear)進行插入操做,和棧同樣,隊列是一種操做受限制的線性表。進行插入操做的端稱爲隊尾,進行刪除操做的端稱爲隊頭。javascript

隊列也是一種列表,隊列用於存儲按順序排列的數據,先進先出(First-In-First-Out, FIFO),能夠想象成銀行前排隊的人羣。前端

使用數組實現隊列

javascript中的數組具備其它編程語言中沒有的優勢,數組的push()能夠在數組的末尾加入元素,shift()能夠刪除數組的第一個 元素。java

function Queue () {
    this.dataStore = []
}
Queue.prototype = {
    constructor: Queue,
    // 向對位添加一個元素
    enqueue: function (element) {
        this.dataStore.push(element)
    },
    // 刪除隊首元素
    dequeue: function () {
        return this.dataStore.shift()
    },
    // 讀取隊首元素
    front: function () {
        return this.dataStore[0]
    },
    // 讀取隊尾元素
    back: function () {
        return this.dataStore[this.dataStore.length - 1]
    },
    // 顯示隊列內的全部元素
    toString: function () {
        var retStr = ''
        for (var i = 0; i < this.dataStore.length; i++) {
            retStr += this.dataStore[i] + '\n'
        }
        return retStr
    },
    // 判斷隊列是否爲空
    empty: function () {
        if (this.dataStore.length === 0) {
            return true
        } else {
            return false
        }
    }
}
複製代碼

使用隊列對數據進行排序

計算機剛出現時,程序是經過穿孔卡輸入主機的,每張卡包含一條程序語句。這些穿孔卡裝在一個盒子裏,通過一個機械裝置進行排序。咱們可使用一組隊列來模擬這一過程,這種排序技術叫作基數排序,它不是最快的排序算法,可是它展現了一些有趣的隊列使用方法。git

具體方法實現: 對0-99的數字,基數排序將數據集掃描兩次。第一次按個位上的數字進行排序,第二次按十位上的數字進行排序,每一個數字根據對應位上的數值被分在不一樣的盒子裏。算法

假設有以下數字:91, 46, 85, 15, 92, 35, 31, 22編程

// 第一次按個位上掃描排序
box0: 
box1: 91, 31
box2: 92, 22
box3: 
box4: 
box5: 85, 15, 35
box6: 46
box7: 
box8:
box9
複製代碼

排序後結果爲:91, 31, 92, 22, 85, 15, 35, 46後端

box0:
box1: 15
box2: 22
box3: 31, 35
box4: 46
box5:
box6:
box7:
box8: 85
box9: 91, 92
複製代碼

排序後結果爲:15, 22, 31, 35, 46, 85, 91, 92數組

// 能夠想象成上體育課時老師組隊時,其實也是一種算法dom

使用隊列表明盒子,能夠實現這種算法。咱們須要9個隊列,每一個對應一個數字,將全部隊列保存在一個數組中,使用取餘和除法操做決定個位和十位,根據算法的剩餘部分將數字加入相應的隊列。編程語言

// 根據相應位(個位,十位)上的數值,將數字分配到相應隊列
function distribute (nums, queues, n, digit) {
    for (var i = 0; i < n; i++) {
        if (digit === 1) {
            queues[nums[i] % 10].enqueue(nums[i])
        } else {
            queues[Math.floor(nums[i] / 10)].enqueue(nums[i])
        }
    }
}

// 從隊列中收集數字
function collect (queues, nums) {
    var i = 0
    for (var digit = 0; digit < 10; digit++) {
        while (!queues[digit].empty()) {
            nums[i++] = queues[digit].dequeue()
        }
    }
}

// 主程序
var queues = []
for (var i = 0; i < 10; i++) {
    queues[i] = new Queue()
}
var nums = []
for (var j = 0; j < 10; j++) {
    nums[j] = Math.floor(Math.floor(Math.random() * 101))
}
console.log('before')
console.log(nums)
distribute(nums, queues, 10, 1)
collect(queues, nums)
distribute(nums, queues, 10, 10)
collect(queues, nums)
console.log('after')
console.log(nums)
複製代碼

隊列和棧同樣也是一種思想,好比提交操做系統執行的一系列進程,打印任務池等就要用到隊列。一個名詞在一種陌生環境內咱們會感到很神奇,好比直接說計算機中的隊列咱們會感受很高深,映射成生活中的例子咱們就能理解了。固然這些術語,詞,概念都是人爲的抽象,人的高度概況。數學中的總總知識點,咱們剛開始學的時候很難理解,由於沒有使用語境帶入,可是總有聰明人能完美使用,還能總結出新的知識,創造出新的東西,計算機就是人爲知識的結晶,還能把咱們的思想賦予計算機,隨着科技的發展,計算機也會有思想的那一天。

相關文章
相關標籤/搜索