题解 | 四则运算

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e


import Foundation

func evaluateExpression(_ expression: String) -> Int {
    // 替换所有括号为小括号
    var exp = expression
        .replacingOccurrences(of: "[", with: "(")
        .replacingOccurrences(of: "]", with: ")")
        .replacingOccurrences(of: "{", with: "(")
        .replacingOccurrences(of: "}", with: ")")
    
    // 用于存储操作数的栈
    var numbers: [Int] = []
    // 用于存储运算符的栈
    var operators: [Character] = []
    
    var i = 0
    while i < exp.count {
        let char = exp[exp.index(exp.startIndex, offsetBy: i)]
        
        // 如果是数字,解析整个数字
        if char.isNumber {
            var numStr = String(char)
            while i + 1 < exp.count {
                let nextChar = exp[exp.index(exp.startIndex, offsetBy: i + 1)]
                if nextChar.isNumber {
                    numStr.append(nextChar)
                    i += 1
                } else {
                    break
                }
            }
            numbers.append(Int(numStr)!)
        }
        // 如果是左括号,直接入运算符栈
        else if char == "(" {
            operators.append(char)
        }
        // 如果是右括号,计算到最近的左括号
        else if char == ")" {
            while let op = operators.last, op != "(" {
                let b = numbers.removeLast()
                let a = numbers.removeLast()
                let result = applyOperation(op, b, a)
                numbers.append(result)
                operators.removeLast()
            }
            operators.removeLast() // 弹出左括号
        }
        // 如果是运算符
        else {
            // 处理负号作为一元运算符的情况(例如表达式开头的负号)
            if char == "-" && (i == 0 || exp[exp.index(exp.startIndex, offsetBy: i-1)] == "(") {
                numbers.append(0) // 添加0作为被减数
            }
            
            while !operators.isEmpty &&
                  operators.last! != "(" &&
                  precedence(char) <= precedence(operators.last!) {
                let b = numbers.removeLast()
                let a = numbers.removeLast()
                let op = operators.removeLast()
                let result = applyOperation(op, b, a)
                numbers.append(result)
            }
            operators.append(char)
        }
        
        i += 1
    }
    
    // 处理剩余的运算符
    while !operators.isEmpty {
        let b = numbers.removeLast()
        let a = numbers.removeLast()
        let op = operators.removeLast()
        let result = applyOperation(op, b, a)
        numbers.append(result)
    }
    
    return numbers.last!
}

// 定义运算符优先级
func precedence(_ op: Character) -> Int {
    switch op {
    case "+", "-":
        return 1
    case "*", "/":
        return 2
    default:
        return 0
    }
}

// 执行具体的运算操作
func applyOperation(_ op: Character, _ b: Int, _ a: Int) -> Int {
    switch op {
    case "+":
        return a + b
    case "-":
        return a - b
    case "*":
        return a * b
    case "/":
        return a / b
    default:
        fatalError("Invalid operator")
    }
}

// 读取输入
if let input = readLine() {
    let result = evaluateExpression(input)
    print(result)
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务