这题又有一点考察编译原理的水平了。。。然而我下学期才上这课。。
我粗略的想法是首先,括号里的肯定得先计算出来,然后计算括号外的。如果没括号就正常顺序从左往右计算。
猜想是用stack,先push (,然后当见到) 的时候把 ( )之间的元素加起来?
第一阶段代码: 基本上达成了 加减法运算,但是最大的问题是我想的太简单了 没有想到数字可能出现多个digit的问题。
我的主要思路是 "1+2+(3+4)" 先 push 进stack。 再拿出来的时候顺序: ) 4 + 3 ( + 2 + 1
然后把括号里的东西先reverseString。 主要是为了防止1-3 和3-1这种顺序的情况。
然后()里的东西先计算一下, 4+3的值,然后存在total里。 然后加上 2+1的值。
第二阶段:
为了解决number也许是好几位数的,我做了一个getNumber method. 把连续的数字串变成一个数字return回来,并且返回一个连续的数量,这样好move index。
发现空格也是一个很操蛋的干扰项,经常出现" 3 + 4"这种。 所以我做了一个如果碰到空格就跳过这个stack.pop的地方。【其实现在想想,应该是push进stack的时候看到空格就跳过】。
但是这里遇到了一个bug 非常难搞定
比如"1-(5)"
我的算法会分割成 5 然后 1-. 5先存入了total中,然后total + 1-的值。 也就是5+1=6.
这里应该是一个减法而不是加法。
看了一下dis的答案:也是用stack来做。在stack push的时候 如果不是+, -的全部都无视,不push进stack。
如果是数字的,number = 10 * number + int(c). 如果碰到'(', ')' 这里就厉害了。 把之前计算部分的result push进stack,然后告诉他是+还是-。 清空res,用来计算parenthesis里的值。 计算完成之后,碰到')'的时候代表出括号了,这个时候把之前暂存好的pop出来然后和这个parenthesis里的值相加/相减。
好吧。。。看完答案感觉宛如智障一般。。所以还是要先分析好算法再动笔
我感觉我比较失败的地方就是应该从前往后iterate,而不是从后往前。【因为我pop out的顺序从stack里是后往前。。】