use stack
- 去掉所有空格
- 先给第一个数字加一个默认符号+,变成+1-12+3。
- 把一个运算符和数字组合成一对儿,也就是三对儿+1,-12,+3,把它们转化成数字,然后放到一个栈中。
- 此时要根据sign的 case 不同选择nums的正负号,存入栈中,然后更新sign并清零nums记录下一对儿符合和数字的组合。
- 将栈中所有的数字求和,就是原算式的结果。
乘除法优先于加减法体现在,乘除法可以和栈顶的数结合,而加减法只能把自己放入栈。
stack[-1] = int(stack[-1] / float(num))
因为括号具有递归性质。我们拿字符串3*(4-5/2)-6举例:
calculate(3*(4-5/2)-6) = 3 * calculate(4-5/2) - 6 = 3 * 2 - 6 = 0
可以脑补一下,无论多少层括号嵌套,通过 calculate 函数递归调用自己,都可以将括号中的算式化简成一个数字。换句话说,括号包含的算式,我们直接视为一个数字就行了。
现在的问题是,递归的开始条件和结束条件是什么?遇到(开始递归,遇到)结束递归: