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