对于括号的处理必然要用到stack。本题的处理思想是,遇到左括号就将字符串入栈并清空curStr,直到遇到了右括号,才开始调用子函数eval(curStr)
解析当前的curStr的数值结果.于是子任务eval(s)
就是解析一个不包含括号的运算字符串,类似于227.Basic Calculator II
。解析完的结果再转化为字符串,与栈顶的字符串拼接起来,继续往下处理。
这里与227.Basic Calculator II
不同的一个细节是,我们在eval(s)
里面可以处理这样的字符串:++2-+3*-3-+1/-3
,也就是说,在每个二元运算符加减乘除之外,每个操作数之前可能还有一个符号位。这是为什么呢?举个例子:3+(1-4),括号内得到的其实是-3,于是到了外层需要解析3+-3
。再举个例子:3*(2-4),括号内得到的其实是-2,于是到了外层需要解析3*-2
。这些都是我们需要在eval里考虑到的情况。