编辑代码

import Foundation

// 定义优先级字典,用于存储每种运算符的优先级
let precedence: [String: Int] = ["+": 1, "-": 1, "*": 2, "/": 2, "^": 3, "sqrt": 3]

// 执行计算的函数
func calculate(expression: String) -> Double? {
    // 将表达式中的数字和运算符分开
    let tokens = expression.components(separatedBy: .whitespaces).filter { $0 != "" }
    
    var outputQueue = [String]()  // 用于存储后缀表达式的队列
    var operatorStack = [String]()  // 用于存储运算符的栈
    
    for token in tokens {
        if let number = Double(token) {
            // 如果是数字,直接加入输出队列
            outputQueue.append(String(number))
        } else if token == "sqrt" {
            // 如果是开方运算符,直接加入运算符栈
            operatorStack.append(token)
        } else if token == "(" {
            // 如果是左括号,直接加入运算符栈
            operatorStack.append(token)
        } else if token == ")" {
            // 如果是右括号,将运算符栈中的运算符移到输出队列,直到遇到左括号
            while let op = operatorStack.last, op != "(" {
                outputQueue.append(op)
                operatorStack.removeLast()
            }
            operatorStack.removeLast()  // 移除左括号
        } else if let opPrecedence = precedence[token] {
            // 如果是运算符,根据优先级将运算符移到输出队列
            while let lastOp = operatorStack.last, let lastOpPrecedence = precedence[lastOp], lastOpPrecedence >= opPrecedence {
                outputQueue.append(lastOp)
                operatorStack.removeLast()
            }
            operatorStack.append(token)  // 将当前运算符加入运算符栈
        } else {
            // 非法的输入
            print("非法的输入:\(token)")
            return nil
        }
    }
    
    // 将剩余的运算符加入输出队列
    while let op = operatorStack.last {
        outputQueue.append(op)
        operatorStack.removeLast()
    }
    
    // 计算后缀表达式的值
    var numberStack = [Double]()
    for token in outputQueue {
        if let number = Double(token) {
            numberStack.append(number)
        } else if token == "sqrt" {
            guard let operand = numberStack.popLast() else {
                print("开方运算符缺少操作数")
                return nil
            }
            numberStack.append(sqrt(operand))
        } else {
            guard let operand2 = numberStack.popLast(), let operand1 = numberStack.popLast() else {
                print("运算符缺少操作数")
                return nil
            }
            var result: Double
            switch token {
            case "+":
                result = operand1 + operand2
            case "-":
                result = operand1 - operand2
            case "*":
                result = operand1 * operand2
            case "/":
                result = operand1 / operand2
            case "^":
                result = pow(operand1, operand2)
            default:
                print("未知的运算符:\(token)")
                return nil
            }
            numberStack.append(result)
        }
    }
    
    // 返回计算结果
    return numberStack.last
}

// 这是一个新的计算函数,允许用户输入表达式
func performCalculation() {
    print("请输入表达式(例如 1 + 2 * 3 - sqrt(4)):")
    if let input = readLine() {
        if let result = calculate(expression: input) {
            print("计算结果:\(result)")
        } else {
            print("无法计算表达式")
        }
    }
}

// 调用新的计算函数来执行用户输入的表达式
performCalculation()