import Foundation
func evaluate(_ expression: String) throws -> Double {
enum EvaluationError: Error {
case unbalancedParentheses
case invalidToken(String)
case divisionByZero
}
let separator = CharacterSet.whitespaces.union(.newlines)
let tokens = expression.components(separatedBy: separator).filter { !$0.isEmpty }
var values = [Double]()
var ops = [Character]()
let precedence: [Character: Int] = ["+": 1, "-": 1, "*": 2, "/": 2 , "^": 3]
func applyOp(_ op: Character, rhs: Double, lhs: Double) throws -> Double {
switch op {
case "+": return lhs + rhs
case "-": return lhs - rhs
case "*": return lhs * rhs
case "/":
guard rhs != 0 else { throw EvaluationError.divisionByZero }
return lhs / rhs
case "^": return pows(lhs, rhs)
default: fatalError("Unsupported operation")
}
}
func pows(_ base: Double, _ exponent: Double) -> Double {
let intPart = Int(exponent)
var result = 1.0
for _ in 0..<intPart {
result *= base
}
return result
}
func hasPrecedence(op1: Character, over op2: Character) -> Bool {
guard let prec1 = precedence[op1], let prec2 = precedence[op2] else { return false }
return prec1 >= prec2
}
for token in tokens {
if let value = Double(token) {
values.append(value)
} else if token == "(" {
ops.append("(")
} else if token == ")" {
while !ops.isEmpty && ops.last != "(" {
let op = ops.removeLast()
let rhs = values.removeLast()
let lhs = values.removeLast()
do{
values.append(try applyOp(op, rhs: rhs, lhs: lhs))
} catch{
print("error:\(error)")
}
}
if !ops.isEmpty && ops.last == "(" {
ops.removeLast()
} else {
throw EvaluationError.unbalancedParentheses
}
} else if let firstChar = token.first, precedence[firstChar] != nil {
while !ops.isEmpty && ops.last != "(" && hasPrecedence(op1:ops.last!, over: firstChar) {
let op = ops.removeLast()
let rhs = values.removeLast()
let lhs = values.removeLast()
do{
values.append(try applyOp(op, rhs: rhs, lhs: lhs))
} catch{
print("error:\(error)")
}
}
ops.append(firstChar)
} else {
throw EvaluationError.invalidToken(token)
}
}
while !ops.isEmpty {
if ops.last == "(" {
throw EvaluationError.unbalancedParentheses
}
let op = ops.removeLast()
let rhs = values.removeLast()
let lhs = values.removeLast()
do{
values.append(try applyOp(op, rhs: rhs, lhs: lhs))
}catch{
print("error:\(error)")
}
}
guard values.count == 1 else { throw EvaluationError.unbalancedParentheses }
return values.first!
}
do {
print("请输入一个数学表达式:")
if let input = readLine()?.trimmingCharacters(in: .whitespacesAndNewlines) {
let result = try evaluate(input)
print("Result: \(result)")
} else {
print("未输入有效的表达式。")
}
} catch {
print("Error: \(error)")
}