JavaScript实现队列结构(Queue)

1,468 阅读2分钟

一、队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
重点:先进先出,后进后出

1.1、队列实现

可以基于数组或者链表来实现
只要知道队列的特性就可以很简单的基于数组实现一个队列
代码演示
class Queue {
    constructor() {
        this.items = []
    }
    // 1.加入元素
    enQueue(element) {
        this.items.push(element)
    }
    // 2.删除元素
    deQueue() {
        return this.items.shift()
    }
    // 3.查看元素
    front() {
        return this.items[0]
    }
    // 4.是否为空
    isEmpty() {
        return this.items.length === 0
    }
    // 5.查看个数
    size() {
        return this.items.length
    }
    // 6.toString
    toString() {
        return this.items.join(',')
    }
}

let s = new Queue()
s.enQueue(1)
s.enQueue(2)
s.enQueue(3)
console.log(s)
console.log(s.deQueue())
console.log(s.front())
console.log(s.isEmpty())
console.log(s.size())
console.log(s.toString())

// 队列应用 击鼓传花
class PassGame extends Queue {
    set(name) {
        super.enQueue(name)
    }
    take(num) {
    	// 删除淘汰的直到只剩1位
        while (super.size() > 1) {
            for (let i = 0; i < num - 1; i++) {
                // 将未淘汰的重新插入
                super.enQueue(super.deQueue())
            }
            // 删除淘汰的
            super.deQueue()
        }
        return super.front()
    }
}

let a = new PassGame()
a.set('xw')
a.set('xh')
a.set('xz')
a.set('xx')
a.set('xe')
a.set('xl')
console.log(a.take(4))

二、优先队列

优先级队列主要考虑的问题为:每个元素不再只是一个数据,还包含数据的优先级;
在添加数据过程中,根据优先级放入到正确位置;

2.1优先级队列的实现

class PriorityQueue {
    constructor() {
        this.items = []
    }
    // 1.加入元素
    enQueue(name, priority) {
    	// 初始默认未加入
        let isAdd = false

        for (let i = 0, len = this.items.length; i < len; i++) {
            if (priority < this.items[i].priority) {
                // 当我们要插入的优先级 找到 适合插入的位置时 将其插入
                this.items.splice(i, 0, { name: name, priority: priority })
                isAdd = true
                break
            }
        }

        if (!isAdd) {
            this.items.push({ name: name, priority: priority })
        }
    }
    // 2.删除元素
    deQueue() {
        return this.items.shift()
    }
    // 3.查看元素
    front() {
        return this.items[0]
    }
    // 4.是否为空
    isEmpty() {
        return this.items.length === 0
    }
    // 5.查看个数
    size() {
        return this.items.length
    }
    // 6.toString
    toString() {
        return this.items.join(',')
    }
}

let s = new PriorityQueue()
s.enQueue('xh', 0)
s.enQueue('xx', 10)
s.enQueue('x2', 120)
s.enQueue('xw', 21)
s.enQueue('xe', 82)
console.log(s.items)

大功告成!