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()