20230310 2.3. 队列
简介
队列(Queue):具有一定操作约束的线性表
插入和删除操作:只能在一端插入,而在另一端删除。
- 数据插入:入队列(AddQ)
- 数据删除:出队列(DeleteQ)
- 先来先服务
- 先进先出:FIFO
队列的抽象数据类型描述
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的队列Q ∈ Queue,队列元素item ∈ ElementType
Queue CreatQueue( int MaxSize )
:生成长度为MaxSize的空队列;int IsFullQ( Queue Q, int MaxSize )
:判断队列Q是否已满;void AddQ( Queue Q, ElementType item )
: 将数据元素item插入队列Q中;int IsEmptyQ( Queue Q )
: 判断队列Q是否为空;ElementType DeleteQ( Queue Q )
:将队头数据元素从队列中删除并返回。
队列的顺序存储实现
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成
变种:顺环队列
队列的链式存储实现
队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行
Java 关联
- java.util.Queue
- java.util.AbstractQueue
- java.util.PriorityQueue
- 无界优先级队列
- 底层是数组实现的堆
- java.util.PriorityQueue
- java.util.concurrent.BlockingQueue
- java.util.Deque
- java.util.ArrayDeque
- 此类用作堆栈时可能比 Stack 快,用作队列时比 LinkedList 快
- Deque 的数组实现
- java.util.LinkedList
- 双向链表
- Deque 的链表实现
- java.util.ArrayDeque
- java.util.AbstractQueue
java.util.Queue 方法
方法名 | 抛出异常 | 返回特殊值(false或null) |
---|---|---|
插入 | add | offer |
删除 | remove | poll |
检查 | element | peek |
Queue的插入方法从后插入,删除方法从前删除,符合先进先出FIFO
add
等同于addLast
remove
等同于removeFirst
- 对于方法的特殊约定(抛出异常或者返回特殊值),还是有必要看注释和代码,可能有些类的约定不同
java.util.Deque 方法
- add, addFirst, addLast
- contains
- descendingIterator
- element
- getFirst, getLast
- iterator
- offer, offerFirst, offerLast
- peek, peekFirst, peekLast
- poll, pollFirst, pollLast
- pop, push
- remove, removeFirst, removeLast
- remove 无参方法是删除双向队列的首个元素,等同于 removeFirst
- removeFirstOccurrence, removeLastOccurrence
- 删除第一次(最后一次)出现的元素
- size