Stack(栈)
定义:"限定仅在表尾进行插入或删除操作的线性表"
栈行为有压栈(push) 出栈(pop)
如同一把🔫弹匣 ⬇️装子弹 和 ⬆️开枪 (后进先出)
栈与数组区别:
一个栈是一系列值域的集合,和array(数组)相似,但其是一个比Swift的Array类型更多限制的集合。一个数组可以允许其里面任何位置的插入/删除操作,而栈只允许末端进行出⬇️⬆️操作。
比如我们把 String —> BB弹 ,Int —> 穿甲弹
String 类型的栈 (已定好装什么子弹的弹夹)
//由于数组也拥有栈的操作方式,所以可以给数组加入指定限制就可以成为弹匣了
struct IntStack {
var items = [String]()
mutating func push(item: String) {
items.append(item)
}
mutating func pop() -> String {
return items.removeLast()
}
}
//使用
var myMagazine = IntStack() //直接取来一个弹夹
myMagazine.push("红色BB弹")
myMagazine.push("黑色BB弹")
myMagazine.push("黄色BB弹")
print(myMagazine)
// - IntStack(items: ["红色BB弹", "黑色BB弹", "黄色BB弹""])
泛型栈 (还未成型弹夹)
struct Stack<T> {
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
var CustomMagazine = Stack<Int>() //取来一个弹夹同时指定弹夹类型
CustomMagazine.push(1)
CustomMagazine.push(2)
CustomMagazine.push(3)
print(CustomMagazine)
// - Stack<Int>(items: [1, 2, 3])
那么栈有什么作用?
你有木有发现你使用很多东西,原理都是类似弹匣?
比如浏览器前进与后退、导航视图的页面关系等
可以用在把人类语言转换成计算机喜欢的语言上
比如常用例子:中缀表达式 -> 后缀表达式
(1 + 2) × 3 - 4 //中缀表达式(我们喜欢的方式)
- × + 1 2 3 4 //前缀表达式(波兰式)
1 2 + 3 × 4 - //后缀表达式(逆波兰式)