队列结构

139 阅读2分钟

认识队列

  • 队列(Queue),它是一种受限的线性表,它是先进先出(FIFO First In First Out)

    • 而它受限之处在于它只允许在表的前端(front)进行删除操作
    • 而在表的后端(rear)进行插入操作
  • 生活中类似队列的结构场景:

    • 比如电影院、商场、甚至是厕所排队的场景
    • 优先排队的人,优先处理,例如:买票、结账

队列的使用

  • 打印队列

    • 例如有五分文档需要打印,这些文档会 按照次序放入打印队列
    • 打印机会依次从队列中取出文档,优先放入的文档优先取出,并且对该文档进行打印
    • 以此类推,直到队列中不再有新的文档
  • 线程队列

    • 在开发中,为了让任务可以并行处理,通常会 开启多个线程
    • 但是,我们不能让大量的线程同时运行处理任务,同时运行的话会占用过多的资源
    • 这个时候,如果有需要开启线程处理任务的情况,我们就会使用 线程队列
    • 线程队列会 依照次序 来启动线程,并且处理对应的任务

队列类的创建和常见操作

  • 队列的实现和栈一样,有两种方案:

    • 基于数组实现(队列基于数组性能不高)
    • 基于链表实现
  • 队列的常见操作

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

基于数组封装队列

Snipaste_2023-03-26_19-55-29.png

队列常见操作结果示例:

Snipaste_2023-03-26_19-55-45.png

练习题

击鼓传花:

  • 游戏规则
    • 几个人一起玩一个游戏,围成一圈,开始数数,数到某一个数字 的人自动淘汰
    • 最后剩下的这个人会获得胜利,那么请问最后剩下的是原来在哪一个位置上的人?

Snipaste_2023-03-26_20-25-07.png