Swift 自定义 Stack(栈) -弹匣

作者: 小黑Swift | 来源:发表于2016-04-19 11:40 被阅读284次

    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 -   //后缀表达式(逆波兰式)

    相关文章

      网友评论

        本文标题:Swift 自定义 Stack(栈) -弹匣

        本文链接:https://www.haomeiwen.com/subject/fjoalttx.html