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
}
}