栈:
栈是一种特殊的数据结构。其特点为“先进后出”,像菜碟一样,最先进去的放在最下面,随后进来的依次堆积。在iOS里面,也存在着栈的应用,最明显的就是导航栈了,最先显示在屏幕上的VC在栈最下面,随后点击进入显示的VC依次处于栈的顶部,随着用户不断地进行返回操作,最后面的VC至一开始的VC也依次出栈(第一个VC不可能出栈,除非将其手动关闭 )
常见的操作包括是否为空、数量、出栈、入栈、栈顶元素等操作。就出栈和入栈而言,出栈的时间复杂度为O(1),因为其获取到最后一个元素地址直接就移除了;入栈也是如此。
iOS特点:
1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似于数据结构中的栈。
2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。其类似于链表。
常见的基本类型、结构体、枚举是属于栈类型存储的,类是属于引用类型存储的。栈的访问由CPU直接控制进行头尾指针访问,因此速度很快,但该空间缺点是很小。
代码实现:
定义结构体,参数为泛型。mutating修饰符是对于结构体的方法而言可以使其进行地址操作的行为作用。
public struct Stack<T> {
private var elements = [T]()
public init() {}
public mutating func pop() -> T? {
return self.elements.popLast()
}
public mutating func push(element: T){
self.elements.append(element)
}
public func peek() -> T? {
return self.elements.last
}
public func isEmpty() -> Bool {
return self.elements.isEmpty
}
public var count: Int {
return self.elements.count
}
}
测试应用:
var testStack: Stack = Stack<Int>()
testStack.push(element: 1)
testStack.push(element: 3)
testStack.push(element: 5)
testStack.pop()
testStack.pop()
testStack.count