编辑代码

import Foundation


struct Complex {
    var real: Double
    var imaginary: Double
}

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

// 计算开方
func squareRoot(_ num: Double) -> Double {
    guard num >= 0 else {
        fatalError("无法对负数进行开方运算")
    }
    return num.squareRoot()
}

// 将中缀表达式转换为后缀表达式
func infixToPostfix(_ expression: String) -> String {
    var result = ""
    var stack = [Character]()

    for char in expression {
        if char.isNumber {
            result.append(char)
        } else if char == "(" {
            stack.append(char)
        } else if char == ")" {
            while let last = stack.last, last != "(" {
                result.append(stack.removeLast())
            }
            stack.removeLast()
        } else {
            while let last = stack.last, last != "(", precedence[last] ?? 0 >= precedence[char] ?? 0 {
                result.append(stack.removeLast())
            }
            stack.append(char)
        }
    }

    while let last = stack.last {
        result.append(stack.removeLast())
    }

    return result
}

// 计算后缀表达式的值
func evaluatePostfix(_ expression: String) -> Double {
    var stack = [Double]()

    for char in expression {
        if char.isNumber {
            stack.append(Double(String(char))!)
        } else {
            let b = stack.removeLast()
            if char == "&" {
                stack.append(squareRoot(b))
            } else{
                let a = stack.removeLast()
                switch char {
                case "+":
                    stack.append(a + b)
                case "-":
                    stack.append(a - b)
                case "*":
                    stack.append(a * b)
                case "/":
                    stack.append(a / b)
                case "^":
                    stack.append(pow(a, b))
                default:
                    break
                }
            }
            
        }
    }

    return stack.first ?? 0
}

// 主函数
func calculate(_ expression: String) -> Double {
    let postfixExpression = infixToPostfix(expression)
    return evaluatePostfix(postfixExpression)
}

// 循环输入表达式
var inputExpression = ""
while true {
    print("请输入表达式(输入 a 退出):")
    if let input = readLine(), input != "a" {
        inputExpression = input
        print("\(inputExpression) = \(calculate(inputExpression))")
    } else {
        break
    }
}