【JS数据结构】线性结构——队列

本文详细介绍了JavaScript中的队列数据结构,包括队列的概念、现实生活中的应用、基于数组的队列实现,以及如何创建和操作队列。此外,还探讨了优先级队列的特点、应用场景及其实现,提供了一个使用队列解决面试题——击鼓传花问题的示例。
摘要由CSDN通过智能技术生成

目录

一. 队列结构

1.队列(Queue)

2.生活中类似的队列结构

3.队列的图解

4.队列在程序中的应用

二. 队列实现

1.队列的创建

1.1 创建自己的类, 来表示一个队列

1.2 代码解析

2.队列的操作

2.1 方式一

2.2 方式二——建议使用

三. 优先级队列

1.优先级队列的特点

2.优先级队列应用

3.优先级队列的实现

四. 队列面试题

1.击鼓传花


一. 队列结构

1.队列(Queue)

  • 队列是一种受限的线性结构
  • 受限之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,符合先进先出(FIFO First In First Out)

2.生活中类似的队列结构

  • 生活中类似队列的场景就是非常多了, 比如在电影院, 商场, 甚至是厕所排队.
  • 优先排队的人, 优先处理. (买票, 结账, WC)

3.队列的图解

4.队列在程序中的应用

  • 打印队列:
    • 有五份文档需要打印, 这些文档会按照次序放入到打印队列中.
    • 打印机会依次从队列中取出文档, 优先放入的文档, 优先被取出, 并且对该文档进行打印.
    • 以此类推, 直到队列中不再有新的文档.
  • 线程队列:
    • 在进行多线程开发时, 我们不可能无限制的开启新的线程.
    • 这个时候, 如果有需要开启线程处理任务的情况, 我们就会使用线程队列.
    • 线程队列会依照次序来启动线程, 并且处理对应的任务.

二. 队列实现

队列的实现和栈一样,有两种方案:基于数组实现;基于链表实现

本次代码都基于数组实现。(基于数组的缺点:如果删除队头元素,之后的所有元素都需要向前移)

1.队列的创建

1.1 创建自己的类, 来表示一个队列

        // 1.封装队列类(基于对象方式)
        function Queue() {
            //属性
            this.items = []

            //方法

        }

        //2.使用队列
        var queue = new Queue()

1.2 代码解析

  • 创建了一个Queue构造函数, 用户创建队列的类.
  • 在构造函数中, 定义了一个变量, 这个变量可以用于保存当前队列对象中所有的元素. (和创建栈非常相似)
  • 这个变量是一个数组类型. 我们之后在队列中添加元素或者删除元素, 都是在这个数组中完成的.
  • 队列和栈一样, 有一些相关的操作方法, 通常无论是什么语言, 操作都是比较类似的.

2.队列的操作

  • enqueue(element):向队列尾部添加一个(或多个)新的项。
  • dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
  • front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。
  • isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
  • size():返回队列包含的元素个数,与数组的length属性类似。
  • toString():将队列中内容,转成字符串形式。
  • clear():删除队列中所有元素

2.1 方式一

        // 1.自定义队列
        function Queue() {
            var items = []

            // 队列操作的方法
            // 1.1enter queue方法
            this.enqueue = function (element) {
                items.push(element)
            }

            // 1.2delete queue方法:先进入队列中的元素, 先从队列中取出. 因此, 应该删除第一个元素
            this.dequeue = function () {
                return items.shift()
            }

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

            // 1.4查看队列是否为空
            this.isEmpty = function () {
                return items.len
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值