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