import Foundation
let precedence: [Character: Int] = ["+": 1, "-": 1, "*": 2, "/": 2]
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
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
}
let expression1 = "3+5*4"
if let result1 = evaluate(expression: expression1) {
print("Result of \(expression1): \(result1)")
} else {
print("Invalid expression: \(expression1)")
}
let expression2 = "1+(3+5)*4"
if let result2 = evaluate(expression: expression2) {
print("Result of \(expression2): \(result2)")
} else {
print("Invalid expression: \(expression2)")
}