题解 | 四则运算
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import Foundation func evaluateExpression(_ expression: String) -> Int { // 替换所有括号为小括号 var exp = expression .replacingOccurrences(of: "[", with: "(") .replacingOccurrences(of: "]", with: ")") .replacingOccurrences(of: "{", with: "(") .replacingOccurrences(of: "}", with: ")") // 用于存储操作数的栈 var numbers: [Int] = [] // 用于存储运算符的栈 var operators: [Character] = [] var i = 0 while i < exp.count { let char = exp[exp.index(exp.startIndex, offsetBy: i)] // 如果是数字,解析整个数字 if char.isNumber { var numStr = String(char) while i + 1 < exp.count { let nextChar = exp[exp.index(exp.startIndex, offsetBy: i + 1)] if nextChar.isNumber { numStr.append(nextChar) i += 1 } else { break } } numbers.append(Int(numStr)!) } // 如果是左括号,直接入运算符栈 else if char == "(" { operators.append(char) } // 如果是右括号,计算到最近的左括号 else if char == ")" { while let op = operators.last, op != "(" { let b = numbers.removeLast() let a = numbers.removeLast() let result = applyOperation(op, b, a) numbers.append(result) operators.removeLast() } operators.removeLast() // 弹出左括号 } // 如果是运算符 else { // 处理负号作为一元运算符的情况(例如表达式开头的负号) if char == "-" && (i == 0 || exp[exp.index(exp.startIndex, offsetBy: i-1)] == "(") { numbers.append(0) // 添加0作为被减数 } while !operators.isEmpty && operators.last! != "(" && precedence(char) <= precedence(operators.last!) { let b = numbers.removeLast() let a = numbers.removeLast() let op = operators.removeLast() let result = applyOperation(op, b, a) numbers.append(result) } operators.append(char) } i += 1 } // 处理剩余的运算符 while !operators.isEmpty { let b = numbers.removeLast() let a = numbers.removeLast() let op = operators.removeLast() let result = applyOperation(op, b, a) numbers.append(result) } return numbers.last! } // 定义运算符优先级 func precedence(_ op: Character) -> Int { switch op { case "+", "-": return 1 case "*", "/": return 2 default: return 0 } } // 执行具体的运算操作 func applyOperation(_ op: Character, _ b: Int, _ a: Int) -> Int { switch op { case "+": return a + b case "-": return a - b case "*": return a * b case "/": return a / b default: fatalError("Invalid operator") } } // 读取输入 if let input = readLine() { let result = evaluateExpression(input) print(result) }