Swift - 栈
文章时间 Dec 16 2016
翻译编写时间 Sep 18 2019
leetcode 相关 : 20,155,232,844,224,682,496.
栈,和数组有相似的地方,但是有着有限的功能。你只能 push 在栈顶来增加一个新的元素, pop 来移出栈顶元素,peek 查看栈顶元素而不做其余的操作。
在许多的算法中,你需要在某些时刻将对象添加到临时列表,一段时间后再把他们从列表中删除。很多时候,添加和删除的顺序很重要。
栈使用的是 LIFO (last-in first-out order)后进先出的顺序。
利用 array 来实现栈
1 2 3
| struct Stack { fileprivate var array: [String] = [] }
|
Push
在数组里往后添加元素,而非将新的元素插入到第一个的位置。这样的目的是减少时间复杂度,前者只需要 O(1),后者需要 O(n)
1 2 3 4 5
| mutating func push(_ element: String) { array.append(element) }
|
CustomStringConvertible
joined(separator:)
将所有的对象凭借到一起,每个对象之间插入方法的参数
["3D Games by Tutorials", "tvOS Apprentice"]
-> "3D Games by Tutorials\ntvOS Apprentice"
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| extension Stack: CustomStringConvertible { var description: String { let topDivider = "---Stack---\n" let bottomDivider = "\n-----------\n"
let stackElements = array.reversed().joined(separator: "\n") return topDivider + stackElements + bottomDivider } }
|
Pop
1 2 3 4 5
| mutating func pop() -> String? { return array.popLast() }
|
泛型
1 2 3
| struct Stack<Element> { }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| struct Stack<Element> { fileprivate var array: [Element] = []
mutating func push(_ element: Element) { array.append(element) }
mutating func pop() -> Element? { return array.popLast() }
func peek() -> Element? { return array.last } }
|
1 2 3 4 5
| let stackElements = array.reversed().joined(separator: "\n")
let stackElements = array.map { "\($0)" }.reversed().joined(separator: "\n")
|
总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public struct Stack<T> { fileprivate var array = [T]()
public var isEmpty: Bool { return array.isEmpty }
public var count: Int { return array.count }
public mutating func push(_ element: T) { array.append(element) }
public mutating func pop() -> T? { return array.popLast() }
public var top: T? { return array.last } }
|