Swift 自定义 Stack(栈) -弹匣

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 -   //后缀表达式(逆波兰式)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,273评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,929评论 18 399
  • 最近几年,我时常会遇到另一个自己。 这个我,会“站”在天空里,不说话,就俯视着看着我。看着我整天忙东忙西,忙着些有...
    快乐的黑玛丽阅读 1,911评论 9 4
  • 亲爱的女儿: 今年的国庆与中秋假期到今日已算是过去了,你的感觉怎样呢,过得有意义吗?过得开心吗?如何面对...
    陈虹_dd45阅读 1,475评论 0 0
  • #import "LoadData.h" #import "Model.h" // 创建一个静态变量 static...
    本泽马阅读 1,456评论 0 0