[ 题目描述 ]:
[ 思路 ]:
- 由于题目中只有加减运算,而减法运算可以看成加上一个负数
- 那么我们只要弄清每个数的正负,然后将这些数求和,即可得到正确答案
- 由题可以看到,负号后紧跟数字,则是负数,负号后跟的若是括号,则需要将括号中的数字的符号全部反转
- 那么,难点就在于如何判断 - ( -( -() ) ),这种嵌套括号中数字的符号,尤其是 ’ ) ’ 后面的数的符号需要注意
- 通过栈来实现符号处理问题,初始化栈顶符号为 ’ + ’
- 当遇见 ’ ( ’ 时,将当前符号压入栈,因为这代表的他这个括号中的符号是否需要反转
- 当遇见 ’ ( ’ 时,将栈顶符号弹出栈,因为该符号所表示的括号中的数已经处理完了
- 当遇见 ’ + ’ 时,直接取栈顶符号
- 当遇见 ’ - ’ 时,取栈顶符号的相反
- 运行如下
int calculate(char* s) {int len=strlen(s);int signs[len], top = 0,sign=1,res = 0,i=0;signs[top++] = sign;while (i < len) {if (s[i] == ' ') {i++;} else if (s[i] == '+') {sign = signs[top - 1];i++;} else if(s[i] == '-') {sign = -signs[top - 1];i++;} else if(s[i] == '(') {signs[top++] = sign;i++;} else if(s[i] == ')') {top--;i++;} else {long num = 0;while (i < len && s[i] >= '0' && s[i] <= '9') {num = num * 10 + s[i] - '0';i++;}res += sign * num;}}return res;
}
[ 官方题解 ]:
- 方法一:括号展开 + 栈,基本同上