[Swift]队列Queue的两种版本:(1)用类包装Queue (2)用泛型包装Queue
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9854901.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
类版本队列
1 class Queue 2 { 3 //给类添加一个Any类型的数组属性 4 //Any可以表示任何类型,包括函数类型、可选类型 5 var queue: [Any] 6 7 //属性:获取队列的大小 8 var count: Int 9 { 10 get { 11 return queue.count 12 } 13 } 14 15 // 计算属性:返回队列的存储容量,数组会自动扩大为原来两倍 16 // - get:获取队列的存储空间,但不会分配新的存储空间 17 // - set:分配足够的空间来存储指定数量的元素 18 var capacity: Int { 19 get { 20 return queue.capacity 21 } 22 set { 23 queue.reserveCapacity(newValue) 24 } 25 } 26 27 //初始化方法用来对数组属性初始化 28 //如果定义了默认值,则可以在调用函数时省略该参数 29 init() 30 { 31 queue = [Any]() 32 } 33 34 //通过既定数组构造队列 35 init(_ arr:[Any]){ 36 queue = arr 37 } 38 39 // 如果定义了默认值,则可以在调用函数时省略该参数 40 init(_ elements: Any...) { 41 queue = elements 42 } 43 44 //判断队列是否为空 45 func isEmpty() -> Bool 46 { 47 return queue.isEmpty 48 } 49 50 //检查队列是否已满 51 //如果队列已满,则返回true,否则返回false 52 public func isFull() -> Bool { 53 return count == queue.capacity 54 } 55 56 //清空队列 57 func clear() 58 { 59 queue.removeAll() 60 } 61 62 //入队列(一次可入队一个或多个元素) 63 //可变参数参数接受具有指定类型的零个或更多的值 64 func enQueue(_ objects: Any...) 65 { 66 for obj in objects { 67 queue.append(obj) 68 } 69 } 70 71 //出队列 72 func deQueue() -> Any? 73 { 74 //判断队列是否为空 75 if isEmpty() 76 { 77 return nil 78 } 79 else 80 { 81 //数组中移除第一个元素 82 return queue.removeFirst() 83 } 84 } 85 86 //获取最后队列第一个元素 87 func getFirst() -> Any? 88 { 89 //判断堆栈是否为空 90 if isEmpty() 91 { 92 return nil 93 } 94 else 95 { 96 //获取队列第一个元素 97 return queue.first! 98 } 99 } 100 101 // 在打印队列及其元素时,输出简洁的格式 102 var description: String { 103 get { 104 return queue.description 105 } 106 } 107 108 // 打印时输出简洁漂亮的格式,主要用于调试 109 var debugDescription: String { 110 get { 111 return queue.debugDescription 112 } 113 } 114 } 115 116 //初始化队列 117 var queue1 = Queue() 118 var queue2 = Queue([1,2,3]) 119 dump(queue2) 120 /* 121 ▿ prog.Queue #0 122 ▿ queue: 1 element 123 ▿ 3 elements 124 - 1 125 - 2 126 - 3 127 */ 128 var queue3 = Queue(4,5,6) 129 dump(queue3) 130 /* 131 ▿ prog.Queue #0 132 ▿ queue: 3 elements 133 - 4 134 - 5 135 - 6 136 */ 137 //入队 138 queue1.enQueue(1,2,3,4,5,6) 139 //出队 140 queue1.deQueue() 141 dump(queue1) 142 /* 143 ▿ prog.Queue #0 144 ▿ queue: 5 elements 145 - 2 146 - 3 147 - 4 148 - 5 149 - 6 150 */ 151 queue1.clear() 152 dump(queue1) 153 /* 154 ▿ prog.Queue #0 155 - queue: 0 elements 156 */
泛型版本队列
1 public struct Queue<T> { 2 3 // 泛型数组:用于存储数据元素 4 fileprivate var queue: [T] 5 6 // 返回队列中元素的个数 7 public var count: Int { 8 return queue.count 9 } 10 11 // 计算属性:返回队列的存储容量 12 // - get:获取队列的存储空间,但不会分配新的存储空间 13 // - set:分配足够的空间来存储指定数量的元素 14 public var capacity: Int { 15 get { 16 return queue.capacity 17 } 18 set { 19 queue.reserveCapacity(newValue) 20 } 21 } 22 23 // 构造函数:创建一个空的队列 24 public init() { 25 queue = [T]() 26 } 27 28 //通过既定数组构造队列 29 init(_ arr:[T]){ 30 queue = arr 31 } 32 33 // 如果定义了默认值,则可以在调用函数时省略该参数 34 init(_ elements: T...) { 35 queue = elements 36 } 37 38 // 检查队列是否为空 39 // - returns: 如果队列为空,则返回true,否则返回false 40 public func isEmpty() -> Bool { 41 return queue.isEmpty 42 } 43 44 // 检查队列是否已满 45 // -returns: 如果队列已满,则返回true,否则返回false 46 public func isFull() -> Bool { 47 return count == queue.capacity 48 } 49 50 // 将队列重置为空状态 51 public mutating func clear() { 52 queue.removeAll() 53 } 54 55 // 入队列操作:将元素添加到队列的末尾 56 public mutating func enQueue(_ element: T) { 57 queue.append(element) 58 } 59 60 // 出队列操作:删除并返回队列中的第一个元素 61 public mutating func deQueue() -> T? { 62 return queue.removeFirst() 63 } 64 65 // 返回队列中的第一个元素(不删除) 66 public func getFirst() -> T? { 67 return queue.first! 68 } 69 70 // 在打印队列及其元素时,输出简洁的格式 71 public var description: String { 72 return queue.description 73 } 74 75 76 // 打印时输出简洁的格式,主要用于调试 77 public var debugDescription: String { 78 return queue.debugDescription 79 } 80 }