认识队列
-
队列(Queue),它是一种受限的线性表,它是先进先出(FIFO First In First Out)
- 而它受限之处在于它只允许在表的前端(front)进行删除操作
- 而在表的后端(rear)进行插入操作
-
生活中类似队列的结构场景:
- 比如电影院、商场、甚至是厕所排队的场景
- 优先排队的人,优先处理,例如:买票、结账
队列的使用
-
打印队列
- 例如有五分文档需要打印,这些文档会 按照次序放入 到 打印队列 中
- 打印机会依次从队列中取出文档,优先放入的文档,优先取出,并且对该文档进行打印
- 以此类推,直到队列中不再有新的文档
-
线程队列
- 在开发中,为了让任务可以并行处理,通常会 开启多个线程
- 但是,我们不能让大量的线程同时运行处理任务,同时运行的话会占用过多的资源
- 这个时候,如果有需要开启线程处理任务的情况,我们就会使用 线程队列
- 线程队列会 依照次序 来启动线程,并且处理对应的任务
队列类的创建和常见操作
-
队列的实现和栈一样,有两种方案:
- 基于数组实现(队列基于数组性能不高)
- 基于链表实现
-
队列的常见操作
- enqueue(element):向队列尾部添加一个(或多个)新的项
- dequeue():移除队列的第一项(即排在队列最前面的项),并返回被移除的元素
- front():返回队列中第一个元素——最先被添加的元素,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息——与 stack 类的 peek 方法非常类似)
- isEmpty():如果队列中不包含任何元素,返回 true,否则返回 false
- size():返回队列包含的元素个数,与数组的 length 属性类似
- toString():将队列中的内容,转成字符串
基于数组封装队列
队列常见操作结果示例:
练习题
击鼓传花:
- 游戏规则
- 几个人一起玩一个游戏,围成一圈,开始数数,数到某一个数字 的人自动淘汰
- 最后剩下的这个人会获得胜利,那么请问最后剩下的是原来在哪一个位置上的人?