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()
} else if let _ = precedence[token.first!] {
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 ?? ""))")
}