编辑代码

import Foundation

// 定义操作符优先级
let precedence: [Character: Int] = ["+": 1, "-": 1, "*": 2, "/": 2, "^": 3, "k": 4, "s": 4]

// 定义操作符结构体
struct Operator {
    let value: Character
    let precedence: Int
}

// 定义操作数结构体
struct Operand {
    let value: Double
}

// 解析表达式
func parseExpression(_ expression: String) -> [Any] {
    var parsedExpression = [Any]()
    var currentNumber = ""
    
    for char in expression {
        if char.isNumber || char == "." {
            currentNumber.append(char)
        } else {
            if !currentNumber.isEmpty {
                parsedExpression.append(Operand(value: Double(currentNumber)!))
                currentNumber = ""
            }
            if char != " " {
                parsedExpression.append(Operator(value: char, precedence: precedence[char] ?? 0))
            }
        }
    }
    
    if !currentNumber.isEmpty {
        parsedExpression.append(Operand(value: Double(currentNumber)!))
    }
    
    return parsedExpression
}

// 计算表达式
func evaluateExpression(_ parsedExpression: [Any]) -> Double {
    var operandStack = [Operand]()
    var operatorStack = [Operator]()
    
    for element in parsedExpression {
        if let operand = element as? Operand {
            operandStack.append(operand)
        } else if let op = element as? Operator {
            if op.value == "(" {
                operatorStack.append(op)
            } else if op.value == ")" {
                while let topOp = operatorStack.last?.value, topOp != "(" {
                    performOperation(&operandStack, &operatorStack)
                }
                operatorStack.removeLast()
            } else {
                while let topOp = operatorStack.last, topOp.precedence >= op.precedence {
                    performOperation(&operandStack, &operatorStack)
                }
                operatorStack.append(op)
            }
        }
    }
    
    while let _ = operatorStack.last {
        performOperation(&operandStack, &operatorStack)
    }
    
    return operandStack.first!.value
}

// 执行运算
func performOperation(_ operandStack: inout [Operand], _ operatorStack: inout [Operator]) {
    let op = operatorStack.removeLast()
    let b = operandStack.removeLast().value
    let a = operandStack.isEmpty ? 0 : operandStack.removeLast().value
    var result: Double = 0
    
    switch op.value {
    case "+":
        result = a + b
    case "-":
        result = a - b
    case "*":
        result = a * b
    case "/":
        result = a / b
    case "^":
        result = pow(a, b)
    case "k":
        result = sqrt(b)
    case "s":
        result = sin(b * Double.pi / 180) // 处理角度值时的转换,注意这里应该将角度值转换为弧度
    default:
        break
    }
    
    operandStack.append(Operand(value: result))
}


// 主函数
func main() {
    print("请输入一个表达式:")
    if let expression = readLine() {
        let parsedExpression = parseExpression(expression)
        let result = evaluateExpression(parsedExpression)
        print("结果: \(result)")
    } else {
        print("无效的输入")
    }
}

// 执行主函数
main()