编辑代码

import Foundation

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

// 定义一个函数,用于计算两个数的结果
func applyOp(_ op: Character, _ b: Double, _ a: Double) -> Double {
    switch op {
    case "+":
        return a + b
    case "-":
        return a - b
    case "*":
        return a * b
    case "/":
        return a / b
    default:
        fatalError("Unknown operator")
    }
}

// 定义一个函数,用于计算表达式的值
func evaluate(_ expression: String) -> Double {
    let tokens = expression.replacingOccurrences(of: " ", with: "").map { String($0) }
    var values: [Double] = []
    var ops: [Character] = []

    for token in tokens {
        if let value = Double(token) {
            values.append(value)
        } else if token == "(" {
            ops.append(token.first!)
        } else if token == ")" {
            while ops.last != "(" {
                let op = ops.removeLast()
                let b = values.removeLast()
                let a = values.removeLast()
                values.append(applyOp(op, b, a))
            }
            ops.removeLast() // Remove the opening parenthesis
        } else if let _ = precedence[token.first!] {
            // 当前token是一个运算符
            // 比较当前运算符与栈顶运算符的优先级
            while !ops.isEmpty && precedence[token.first!]! <= precedence[ops.last!]! {
                let op = ops.removeLast()
                let b = values.removeLast()
                let a = values.removeLast()
                values.append(applyOp(op, b, a))
            }
            ops.append(token.first!)
        } else {
            fatalError("Invalid character found: \(token)")
        }
    }

    // 处理剩余的运算符
    while !ops.isEmpty {
        let op = ops.removeLast()
        let b = values.removeLast()
        let a = values.removeLast()
        values.append(applyOp(op, b, a))
    }

    // 返回最终结果
    return values.first ?? 0.0
}

// 测试
let expression1 = "3.5 + 2 * (6 - 1.2)"
let expression2 = "(5.3 + 2.7) / 2.5 * 4.8"
while true {
    print("请输入'y'退出,或者按任意键继续")
    if let userInput = readLine()?.trimmingCharacters(in: .whitespacesAndNewlines), userInput == "y" {
        break // 退出循环
    }
    let expression = readLine()
    print("\(expression ?? "") = \(evaluate(expression ?? ""))")
}