队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。
在 Swift 中实现 Queue
与 swift 数据结构之 Stack 相同, 也是采用 struct
来实现。
元素如何存储在栈中
入队中的元素如何存储呢?Queue
是我们自定义的一个结构体,需要一个 backing storage
来存储入栈的元素。这里我们使用 Swift
中的 Array
来实现。
1 | public struct Queue<T> { |
由于内部储存不需要向外界暴露,所以使用了 private
, 其内部存储的元素类型与入栈元素类型保持一致。
入队、出队
为 Queue
添加两个实例方法来达到入队、出队的目的。入队就是简单的向内部的数组追加元素,出队则是去除内部数组的第一个元素
1 | public struct Queue<T> { |
取回队头元素
根据队列的特性,队头元素就是第一个入队的元素,也就是内部数组的第一个元素:
1 | public struct Queue<T> { |
队列元素个数、队列是否为空
1 | public struct Queue<T> { |
清空队列
1 | public struct Queue<T> { |
初始化 Queue
1 | public struct Queue<T> { |
使用数组字面量初始化
1 | extension Queue: ExpressibleByArrayLiteral { |
需要将 elements
的类型由 Self.ArrayLiteralElement
改为Queue
中所用到的类型 T
,在调用public init<S: Sequence>(_ s: S)
构造器来完成初始化。
1 | let stack: Queue = [1, 2, 3, 4] // 需显示指明 Queue 的类型,如不指定则优先推断为 Array |
实现 description 和debuDescription
1 | extension Queue: CustomStringConvertible, CustomDebugStringConvertible { |
遍历
1 | extension Queue: Sequence { |
通过 subscript
获取队列中的元素
要实现通过 subscript
获取队列中的元素,则需要遵从 Collection
协议:
1 | extension Queue: Collection { |
完整代码
1 | import Foundation |