數(shù)據(jù)結(jié)構(gòu)與算法 --- 棧習(xí)題(Swift)

首先實現(xiàn)一個順序存儲的棧。

struct MyStack<T> {

    /// 聲明一個泛型數(shù)組,用于存儲棧中的元素(棧結(jié)構(gòu)的后備存儲器)
    private var elements = [T]()

    /// 返回棧結(jié)構(gòu)中元素的個數(shù)
    public var count: Int {

        // 返回數(shù)組elements中的元素個數(shù)
        return elements.count
    }

    /// 獲取或者設(shè)置棧的存儲容量
    public var capacity: Int {

        // 獲取棧的存儲容量
        get {

            // 返回數(shù)組elements的容量
            return elements.capacity
        }

        // 設(shè)置棧的最小容量
        set {

            // 設(shè)置數(shù)組elements的最小容量
            elements.reserveCapacity(newValue)
        }
    }

    /// 初始化方法(創(chuàng)建棧實例)
    public init() {}

    /// 使用push方法執(zhí)行入棧操作
    public mutating func push(element: T) {

        // 判斷棧是否已滿
        if count == capacity {
            fatalError("棧已滿,不能再執(zhí)行入棧操作!")
        }

        // 使用數(shù)組的append()方法將元素添加到數(shù)組elements中
        self.elements.append(element)
    }

    /// 使用pop方法執(zhí)行出棧操作
    @discardableResult
    public mutating func pop() -> T? {

        // 判斷棧是否已空
        if count == 0 {
            fatalError("棧已空,不能再執(zhí)行出棧操作!")
        }

        // 移除數(shù)組elements的最后一個元素
        return elements.popLast()
    }

    /// 返回棧頂元素
    public func top() -> T? {

        // 返回數(shù)組elements的最后一個元素(但是不移除該元素)
        return elements.last
    }

    /// 清空棧中所有的元素
    public mutating func clear() {

        // 清空數(shù)組elements中所有的元素
        elements.removeAll()
    }

    /// 判斷棧是否為空
    public func isEmpty() -> Bool {

        // 判斷數(shù)組elements是否為空
        return elements.isEmpty
    }

    /// 判斷棧是否已滿
    public func isFull() -> Bool {

        // 對數(shù)組的存儲情況進行判斷
        if count == 0 {

            // 如果數(shù)組為空,則表示棧還未存儲數(shù)據(jù)元素
            return false
        } else {

            // 如果數(shù)組不為空,則返回數(shù)組的存儲容量
            // 然后再根據(jù)實際存儲情況判斷棧是否已滿
            return count == elements.capacity
        }
    }
}

一。括號匹配檢驗

假設(shè)表達式中允許包含兩種括號:圓括號和方括號,其嵌套順序隨意,即()或者[([][])]都是正確的,而這[(]或者(()])或者([())都是不正確的格式,檢驗括號是否匹配的方法可用“期待的急迫程度”這個概念來描述,例如,考慮以下括號的判斷:[([][])]

func checkSymbol(orgStr:String) -> Bool {
    let leftArr = ["(", "["]
    let rightArr = [")", "]"]
    let pairValue = ["(":")", "[":"]"]
    
    var stack:MyStack = MyStack<String>()
    stack.capacity = orgStr.count

    for char in orgStr {
        
        let s = String(char)
        
        if leftArr.contains(s) {
            //左邊的括號
            stack.push(element: s)
            
        }else if rightArr.contains(s) {
            //右邊的括號
            if stack.isEmpty() {
                //判斷棧是否為空
                return false
            }else {
                let targetValue = pairValue[stack.top()!]
                if s == targetValue {
                    return true
                }else {
                    return false
                }
            }
        }
    }
    
    return stack.isEmpty()
}

二。每日氣溫

根據(jù)每日氣溫列表,請重新生成一個列表,對應(yīng)位置的輸入時你需要再等待多久溫度才會升高超過該日的天數(shù)。如果之后都不會升高,請在該位置0來代替。例如,給定一個列表temperatures = [73,74,75,71,69,72,76,73],你的輸出應(yīng)該是[1,1,4,2,1,1,0,0]。提示:氣溫列表長度的范圍是[1,30000]。每個氣溫的值的均為華氏度,都是在[30,100]范圍內(nèi)的整數(shù)

func temperature(orgTemArr:[Int]) -> [Int] {
    
    var stack = MyStack<Int>()
    stack.capacity = orgTemArr.count
    
    var resultArr:[Int] = Array.init(repeating: 0, count: orgTemArr.count)
    
    
    for (index, value) in orgTemArr.enumerated() {
        
        if stack.isEmpty() {
            //當(dāng)棧為空
            stack.push(element: index)
        }else {
            //當(dāng)當(dāng)前值小于等于棧頂
            if value <= orgTemArr[stack.top()!] {
                stack.push(element: index)
            }else {
                while !stack.isEmpty(){
                    //如果當(dāng)前值始終大于棧頂,進行對結(jié)果數(shù)組的賦值。
                    if value > orgTemArr[stack.top()!] {
                        let top = stack.top()!
                        resultArr[top] = index - top
                        stack.pop()
                    }else {
                        break
                    }
                }
            }
        }
        
        stack.push(element: index)
    }
    
    return resultArr
}

print("temper ==== \(temperature(orgTemArr: [73,74,75,71,69,72,76,73]))")

運行結(jié)果


image.png

三。爬樓梯
假設(shè)你正在爬樓梯。需要n階你才能到達樓頂。每次你可以爬1或2個臺階。你有多少種不同的方法可以爬到樓頂呢?注意:給定n是一個正整數(shù)

func climbStairs(n:Int) -> Int {
    
    if n == 0 {
        return 0
    }else if n == 1 {
        return 1
    }else if n == 2 {
        return 2
    }
    return climbStairs(n: n-1)+climbStairs(n: n-2)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容