1
func postFix(_ expr: String) -> Int {
    // write your code here
    let nums = expr.components(separatedBy:CharacterSet.decimalDigits.inverted)
        .joined()
    let set = CharacterSet(charactersIn: "+*/%-")
    var ch = expr.components(separatedBy: set.inverted).joined()
    ch.append(" ")
    var rslt = String()


    for i in 0..<nums.count {
        let index = str.index(str.startIndex, offsetBy: i)
        rslt.append(nums[index])
        rslt.append(ch[index])
    }
    let theSet = CharacterSet(charactersIn: "+*/%-0123456789")
    let final = rslt.components(separatedBy: theSet.inverted).joined()
    let expn = NSExpression(format: final)
    let chal = expn.expressionValue(with: nil, context: nil)

    return  chal as! Int
}
print(postFix("4 1 - 2 *"))

我正在制作一种方法来解决未排序字符串的数学运算,我面临的唯一问题是我无法确定从 left-associative 进行运算。而不是 4 - (1 * 2) = 2 我希望它从左侧开始并忽略是否以 * 或 / 首先所以 (4 - 1 ) * 2 = 6

4

1 回答 1

0

我会稍微改变你的逻辑。首先获取所有数字和所有运算符,然后获取第一个元素并将其用作 lhs,迭代数字和删除第一个数字的运算符。使用 lhs + 运算符 + 当前数字 (rhs) 构造您的表达式。将结果分配给 var,下一个 lhs 将是转换为字符串的结果。就像是:


func postFix(_ expr: String) -> Int {
    let numbers = expr.split(whereSeparator: {!"0123456789".contains($0)})
    let operators = expr.split(whereSeparator: {!"+*/%-".contains($0)} )
    guard var lhs = numbers.first else { return .zero }
    var result = 0
    for (rhs, oprtr) in zip(numbers.dropFirst(),operators)  {
        let format = String([lhs,rhs].joined(separator: " " + oprtr + " "))
        result = NSExpression(format: format)
            .expressionValue(with: nil, context: nil) as? Int ?? 0
        lhs = String(result)[...]
    }
    return  result
}

print(postFix("4 1 - 2 *"))  // "6\n"
于 2021-03-30T14:43:39.407 回答