JavaScript实现数据结构--队列、优先队列

队列:一种受限的线性表,先进先出。它只允许在表的前端(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
全部评论

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务