JavaScript数据结构与算法(二)

队列结构(Queue)

是一种受限的线性表,先进先出(FIFO)
  • 限制是:仅在表的前端进行删除操作
  • 仅在表的后端进行插入操作
代码

常见实现方式:

  • 基于数组
  • 基于链表
  1. 数组
     function Queue() {
        console.log('this', this) //Queue对象
        //属性
        this.items = []
        //插入
        Queue.prototype.enqueue = function (ele) {
            this.items.push(ele)
        }

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

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

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

        // size() :返回队列的元素个数
        Queue.prototype.size = function (ele) {
            return this.items.length
        }

        //toString() :将队列的内容以字符形式返回
        Queue.prototype.toString = function (ele) {
            let resultString = ''
            for (let i = 0; i < this.items.length; i++) {
                resultString += this.items[i] + ' '
            }
            return resultString
        }
    }

测试

    let queue = new Queue()
    queue.enqueue(1)
    queue.enqueue(2)
    queue.enqueue(3)
    queue.enqueue(4)
    console.log('queue', queue)
    console.log('queue.dequeue()', queue.dequeue())
    console.log('queue.front()', queue.front())
    console.log('queue.isEmpty()', queue.isEmpty())
    console.log('queue.size()', queue.size())
    console.log('queue.toString()', queue.toString())

测试结果

应用

击鼓传花

 
    function passGame(numList, num) {
        let queue = new Queue()
        //将数组存入队列
        for (let i = 0; i < numList.length; i++) {
            queue.enqueue(numList[i])
        }
        //获取最后剩余的参数
        while (queue.size() > 1) {
             for (let i = 0; i < num - 1; i++) {
                 queue.enqueue(queue.dequeue())
             }
             queue.dequeue()
        }
        //获取该参数的下标
        let index = numList.indexOf(queue.front())
        console.log('index', index)
    }
    passGame([1, 2, 3, 4, 5, 6, 7, 8], 5)
优先级队列

插入元素时,考虑该数据的优先级,把该数据和其他数据优先级进行比较,最后得出这个元素在队列中的正确位置

代码
    function PriorityQueue() {
        function QueueElement(ele, pri) {
            this.ele = ele
            this.pri = pri
        }
        //属性
        this.items = []
        //插入
        PriorityQueue.prototype.enqueue = function (ele, pri) {
            // 创建PriorityQueue对象
            let queueElement = new QueueElement(ele, pri)
            //如果队列为空
            if (this.items.length === 0) {
                this.items.push(queueElement)
            } else {
                let add = false
                for (let i = 0; i < this.items.length; i++) {
                    if (queueElement.pri < this.items[i].pri) {
                        this.items.splice(i, 0, queueElement)
                        add = true
                        break
                    }
                }
                if (!add) {
                    this.items.push(queueElement)
                }
            }
        }

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

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

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

        // size() :返回队列的元素个数
        PriorityQueue.prototype.size = function (ele) {
            return this.items.length
        }

        //toString() :将队列的内容以字符形式返回
        PriorityQueue.prototype.toString = function (ele) {
            let resultString = ''
            for (let i = 0; i < this.items.length; i++) {
                resultString += this.items[i].ele + ' ' + this.items[i].pri + ', '
            }
            return resultString
        }
    }

测试

    let pq = new PriorityQueue()
    pq.enqueue(1, 100)
    pq.enqueue(2, 101)
    pq.enqueue(3, 102)
    pq.enqueue(4, 99)
    console.log('pq', pq)
    console.log('pq.toString()', pq.toString())
    console.log('pq.dequeue()', pq.dequeue())
    console.log('pq.front()', pq.front())
    console.log('pq.isEmpty()', pq.isEmpty())
    console.log('pq.size()', pq.size())
    console.log('pq.toString()', pq.toString())

测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值