编辑代码

import Foundation

// 定义运算符的优先级
let precedence: [Character: Int] = ["+": 1, "-": 1, "*": 2, "/": 2]

// 判断是否为运算符
func isOperator(_ char: Character) -> Bool {
    return precedence.keys.contains(char)
}

// 执行实数运算
func performOperation(_ op: Character, _ num1: Double, _ num2: Double) -> Double {
    switch op {
    case "+": return num1 + num2
    case "-": return num1 - num2
    case "*": return num1 * num2
    case "/": return num1 / num2
    default: return 0
    }
}

// 解析并计算表达式
func evaluate(expression: String) -> Double? {
    var numStack = [Double]()
    var opStack = [Character]()
    
    var numStr = ""
    for char in expression {
        if char.isNumber || char == "." {
            numStr.append(char)
        } else {
            if !numStr.isEmpty {
                if let num = Double(numStr) {
                    numStack.append(num)
                    numStr = ""
                } else {
                    return nil // 无法转换成数字,表达式错误
                }
            }
            
            if char == "(" {
                opStack.append(char)
            } else if char == ")" {
                while let op = opStack.last, op != "(" {
                    if let num2 = numStack.popLast(), let num1 = numStack.popLast() {
                        if let prevOp = opStack.popLast() {
                            numStack.append(performOperation(prevOp, num1, num2))
                        }
                    }
                }
                opStack.popLast() // 弹出左括号
            } else if isOperator(char) {
                while let topOp = opStack.last, isOperator(topOp), let topOpPrecedence = precedence[topOp], let charPrecedence = precedence[char], topOpPrecedence >= charPrecedence {
                    if let num2 = numStack.popLast(), let num1 = numStack.popLast() {
                        if let prevOp = opStack.popLast() {
                            numStack.append(performOperation(prevOp, num1, num2))
                        }
                    }
                }
                opStack.append(char)
            }
        }
    }
    
    if !numStr.isEmpty {
        if let num = Double(numStr) {
            numStack.append(num)
        } else {
            return nil // 无法转换成数字,表达式错误
        }
    }
    
    while let op = opStack.popLast() {
        if let num2 = numStack.popLast(), let num1 = numStack.popLast() {
            numStack.append(performOperation(op, num1, num2))
        }
    }
    
    return numStack.last
}

// 测试
let expression1 = "3+5*4"
if let result1 = evaluate(expression: expression1) {
    print("Result of \(expression1): \(result1)")
} else {
    print("Invalid expression: \(expression1)")
}

let expression2 = "1+(3+5)*4"
if let result2 = evaluate(expression: expression2) {
    print("Result of \(expression2): \(result2)")
} else {
    print("Invalid expression: \(expression2)")
}