import Foundation
let precedence: [Character: Int] = [
"+": 1,
"-": 1,
"*": 2,
"/": 2,
"^": 3,
"√": 3
]
let associativity: [Character: Bool] = [
"+": true,
"-": true,
"*": true,
"/": true,
"^": false,
"√": false
]
func isOperator(_ char: Character) -> Bool {
return precedence.keys.contains(char)
}
func isNumber(_ char: Character) -> Bool {
return char.isNumber || char == "."
}
func performOperation(_ operand1: Double, _ operatorChar: Character,
_ operand2: Double) -> Double {
switch operatorChar {
case "+":
return operand1 + operand2
case "-":
return operand1 - operand2
case "*":
return operand1 * operand2
case "/":
if operand2 == 0 {
print("错误:除数不能为零!")
return Double.nan
}
return operand1 / operand2
case "^":
return pow(operand1, operand2)
case "√":
return pow(operand2, 1/operand1)
default:
return 0
}
}
func convertToRPN(_ expression: String) -> [String] {
var output: [String] = []
var stack: [Character] = []
var numberBuffer = ""
for char in expression {
if isNumber(char) {
numberBuffer += String(char)
} else {
if !numberBuffer.isEmpty {
output.append(numberBuffer)
numberBuffer = ""
}
if isOperator(char) {
while let top = stack.last, isOperator(top) &&
((associativity[char]! && precedence[char]! <= precedence[top]!)
|| (!associativity[char]! && precedence[char]! < precedence[top]!))
{
output.append(String(stack.removeLast()))
}
stack.append(char)
} else if char == "(" {
stack.append(char)
} else if char == ")" {
while let top = stack.last, top != "(" {
output.append(String(stack.removeLast()))
}
stack.removeLast()
}
}
}
if !numberBuffer.isEmpty {
output.append(numberBuffer)
}
while let top = stack.last {
output.append(String(stack.removeLast()))
}
return output
}
func calculateRPN(_ rpn: [String]) -> Double {
var stack: [Double] = []
for token in rpn {
if let number = Double(token) {
stack.append(number)
} else if isOperator(token.first!) {
let operand2 = stack.removeLast()
let operand1 = stack.removeLast()
let result = performOperation(operand1, token.first!,
operand2)
stack.append(result)
}
}
return stack.first!
}
print("请输入一个表达式:")
if let expression = readLine() {
let rpn = convertToRPN(expression)
let result = calculateRPN(rpn)
print("结果:\(result)")
}