數據結構 - 隊列

隊列

隊列是一種遵循先進先出 (FIFO / First In First Out) 原則的一組有序的項;隊列在尾部添加新元素,並從頭部移除元素。最新添加的元素必須排在隊列的末尾。

class Queue {
    constructor (items) {
        this.items = items || []
    }
    //入隊
    enqueue(element) {
        this.items.push(element)
    }
    dequeue() {
        return this.items.shift()
    }
    font() {
        return this.items[0]
    }
    clear() {
        this.items = []
    }
    get size() {
        return this.items.length
    }
    get isEmpty() {
        return !this.items.length
    }
    print() {
        console.log(this.items.toString())
    } 
}

使用隊列類:

const queue = new Queue()
console.log(queue.isEmpty) //true
queue.enqueue('John')
queue.enqueue('Jack')
queue.enqueue('Camila')
console.log(queue.size) //3
console.log(queue.size) //false
queue.dequeue()
queue.dequeue()
queue.print() //'Camila'

優先隊列

優先隊列。元素的添加和移除是基於優先級的。一個現實的例子就是機場登機的順序。頭等艙和商務艙乘客的優先級要高於經濟艙乘客。在有些國家,老年人和孕婦(或 帶小孩的婦女)登機時也享有高於其他乘客的優先級。

實現一個優先隊列,有兩種選項:設置優先級,然後在正確的位置添加元素;或者用入列操作添加元素,然後按照優先級移除它們。

在下面示例中,我們將會在正確的位置添加元素,因此可以對它們使用默認的出列操作:

class PriorityQueue {

    constructor() {
        this.items = []
    }

    enqueue(element, priority){
        const queueElement = { element, priority }
        if (this.isEmpty) {
            this.items.push(queueElement)
        } else {
            const preIndex = this.items.findIndex((item) => queueElement.priority < item.priority)
            if (preIndex > -1) {
                this.items.splice(preIndex, 0, queueElement)
            } else {
                this.items.push(queueElement)
            }
        }
    }

    dequeue(){
        return this.items.shift()
    }

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

    clear(){
        this.items = []
    }

    get size(){
        return this.items.length
    }

    get isEmpty(){
        return !this.items.length
    }

    print() {
        console.log(this.items)
    }
}

優先隊列的使用:

const priorityQueue = new PriorityQueue()
priorityQueue.enqueue('John', 2)
priorityQueue.enqueue('Jack', 1)
priorityQueue.enqueue('Camila', 1)
priorityQueue.enqueue('Surmon', 3)
priorityQueue.enqueue('skyRover', 2)
priorityQueue.enqueue('司馬萌', 1)
priorityQueue.print()

console.log(priorityQueue.isEmpty, priorityQueue.size) // false 6

循環隊列

爲充分利用向量空間,克服"假溢出"現象的方法是:將向量空間想象爲一個首尾相接的圓環,並稱這種向量爲循環向量。存儲在其中的隊列稱爲循環隊列(Circular Queue)。這種循環隊列可以以單鏈表、隊列的方式來在實際編程應用中來實現。

下面我們基於首次實現的隊列類,簡單實現一個循環引用的示例:

class LoopQueue extends Queue{
	constructor(items) {
        super(items)
    }
    getIndex(index) {
        const length = this.items.length
        return index > length ? (index % length) : index
    }
    find(index) {
        return !this.isEmpty ? this.items[this.getIndex(index) :null]
    }
}

訪問一個循環隊列:

const loopQueue = new LoopQueue(['Surmon'])
loopQueue.enqueue('SkyRover')
loopQueue.enqueue('Even')
loopQueue.enqueue('Alice')
console.log(loopQueue.size, loopQueue.isEmpty) // 4 false

console.log(loopQueue.find(26)) // 'Evan'
console.log(loopQueue.find(87651)) // 'Alice'

學習於JavaScript中的數據結構和算法學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章