队列:一种受限的线性表,先进先出。它只允许在表的前端(front)进行删除操作,表的后端(rear)进行插入操作

队列封装

function Queue() {

    this.items = []

    //方法
    //1.将元素加入到队列中
    Queue.prototype.enqueue = function(element) {
        this.items.push(element)
    }

    //2.从队列中删除前端元素
    Queue.prototype.dequeue = function() {
        return this.items.shift()
    }

    //3.查看前端的元素
    Queue.prototype.front = function() {
        return this.items[0]
    }

    //4.查看队列是否为空
    Queue.prototype.isEmpty = function() {
        return this.items.length == 0
    }

    //5.查看队列中元素的个数
    Queue.prototype.size = function() {
        return this.items.length
    }

    //6.toString方法
    Queue.prototype.toString = function() {
        var queueString = ''
        for (let i = 0; i < this.items.length; i++) {
            queueString += this.items[i]
        }

        return queueString
    }

}

队列使用

var queue = new Queue()

queue.enqueue('a')
queue.enqueue('b')
queue.enqueue('e')
queue.enqueue('d')

queue.dequeue()
queue.dequeue()


console.log(queue.front());//e
console.log(queue.toString());//ed

队列的应用题

面试题:击鼓传花

几个人开始数数,数到某个数字的人自动淘汰。 最后剩下的人获得胜利,问最后剩下的是在哪一个位置上的人

function passGame(nameList, num) {
    var queue = new Queue()

    for (var i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i])
    }

    while (queue.size() > 1) {
        for (let i = 0; i < num - 1; i++) {
            queue.enqueue(queue.dequeue())
        }
        queue.dequeue()

    }

    var endName = queue.front()
    console.log('最后剩下的人:' + endName);

    return nameList.indexOf(endName)
}
var nameList = ['lili', 'cat', 'tweb', 'adas', 'nanna']


console.log(passGame(nameList, 3));
//最后剩下的人:adas
//3

优先队列封装

普通的队列具有先进先出的特性,元素追加在队尾,如果删除的话,从队头删除。而在优先队列中,队列中的数据被赋予了优先级。当访问元素时,优先级最高的会先被删除。所以说优先队列是最高级数据先出。

优先队列支持下面两种操作的数据结构

1.删除最小(最大)元素

2.插入一个元素

function PriorityQueue() {
    //在PriorityPriorityQueue重新创建了一个类,理解为内部类
    function PriorityQueueElement(element, priority) {
        this.element = element
        this.priority = priority
    }

    //封装属性
    this.items = []

    //实现插入方法
    PriorityQueue.prototype.enqueue = function(element, priority) {
        //1.创建QueueElement对象
        var queueElement = new PriorityQueueElement(element, priority)


        //2.判断队列是否为空
        if (this.items.length == 0) {
            this.items.push(queueElement)
        } else {
            var added = false
            for (let i = 0; i < this.items.length; i++) {
                if (queueElement.priority < this.items[i].priority) {
                    this.items.splice(i, 0, queueElement)
                    added = true
                    break
                }
            }
            if (!added)
                this.items.push(queueElement)
        }
    }

    //2.从队列中删除前端元素
    PriorityQueue.prototype.dequeue = function() {
        return this.items.shift()
    }

    //3.查看前端的元素
    PriorityQueue.prototype.front = function() {
        return this.items[0]
    }

    //4.查看队列是否为空
    PriorityQueue.prototype.isEmpty = function() {
        return this.items.length == 0
    }

    //5.查看队列中元素的个数
    PriorityQueue.prototype.size = function() {
        return this.items.length
    }

    //6.toString方法
    PriorityQueue.prototype.toString = function() {
        var queueString = ''
        for (let i = 0; i < this.items.length; i++) {
            queueString += this.items[i].element + '-' + this.items[i].priority + ' '
        }

        return queueString
    }

}

优先队列的使用

var pg = new PriorityQueue()
pg.enqueue('小米', 20)
pg.enqueue('华为', 250)
pg.enqueue('苹果', 10)

console.log(pg.toString()); //苹果-10 小米-20 华为-250 

pg.dequeue()
console.log(pg.toString()); //小米-20 华为-250