import Foundation
let precedence: [Character: Int] = ["+": 1, "-": 1, "*": 2, "/": 2, "^": 3]
func isOperator(_ char: Character) -> Bool {
return precedence.keys.contains(char)
}
func performOperation(_ op: Character, _ num1: Double, _ num2: Double) -> Double {
switch op {
case "+": return num1 + num2
case "-": return num1 - num2
case "*": return num1 * num2
case "/": return num1 / num2
case "^": return pow(num1, num2)
default: return 0
}
}
func evaluate(expression: String) -> Double? {
var numStack = [Double]()
var opStack = [Character]()
var numStr = ""
for char in expression {
if char.isNumber || char == "." {
numStr.append(char)
} else {
if !numStr.isEmpty {
if let num = Double(numStr) {
numStack.append(num)
numStr = ""
} else {
return nil
}
}
if char == "(" {
opStack.append(char)
} else if char == ")" {
while let op = opStack.last, op != "(" {
if let num2 = numStack.popLast(), let num1 = numStack.popLast() {
if let prevOp = opStack.popLast() {
numStack.append(performOperation(prevOp, num1, num2))
}
}
}
opStack.popLast()
} else if isOperator(char) {
while let topOp = opStack.last, isOperator(topOp), let topOpPrecedence = precedence[topOp], let charPrecedence = precedence[char], topOpPrecedence >= charPrecedence {
if let num2 = numStack.popLast(), let num1 = numStack.popLast() {
if let prevOp = opStack.popLast() {
numStack.append(performOperation(prevOp, num1, num2))
}
}
}
opStack.append(char)
}
}
}
if !numStr.isEmpty {
if let num = Double(numStr) {
numStack.append(num)
} else {
return nil
}
}
while let op = opStack.popLast() {
if let num2 = numStack.popLast(), let num1 = numStack.popLast() {
numStack.append(performOperation(op, num1, num2))
}
}
return numStack.last
}
print("Enter expressions to evaluate (type 'quit' to exit):")
while let input = readLine() {
if input.lowercased() == "quit" {
break
}
if let result = evaluate(expression: input) {
print("Result: \(result)")
} else {
print("Invalid expression.")
}
}