解题思路都在代码的注释中,非常详细,相信都能看懂
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(char* s )
{
// write code here
int res = 0;
int sum[500] = {0}; //由于题目没有指出s长度,就拍脑袋决定的500,不够可以手动调整
int k=0;//记录sum数组里有多少数
int num = 0,i=0; //num记录连续字符串的转化数字结果或者记录递归结果
char sign = '+'; //记录前一个符号,初始化为+,因为可以看成当前字符串前先加0
for(i = 0;i<strlen(s);i++)
{
if(s[i] == ' ') //如果是空格,则跳过
continue;
if(s[i] >='0' && s[i] <= '9') //处理数字
num = 10*num + s[i] - '0';
if(s[i] == '(')
{
int left = i;//left记录最左边左括号的位置
int count = 1; //count记录左括号数
i++;
while(count>0)
{
if(s[i] == '(') count++;
else if(s[i] == ')') count--;
i++;
}
char substr[50] = {0};
memcpy(substr,s+left+1,i-left-2); //迭代计算括号内数值,注意不要包含最左最右括号,不然会死循环
//取left+1和i-1之间的字符串
num = solve(substr);
i--; //此时i是最右括号下一位,需要左移一位防止最右括号在字符串尾时发生越界从而使下面的判定失效
}
if(i==strlen(s)-1 || s[i] == '+' || s[i] == '-' || s[i] == '*')
{
if(sign == '+') sum[k++] = num; //对于+则将数字入数组
else if(sign == '-') sum[k++] = -num; //对于-,相当于加负数
else if(sign == '*') sum[k-1] = sum[k-1]*num; //对于乘法,则直接与栈顶相乘,由于k始终指向下一个元素,这时候要把k减1
sign = s[i];
num = 0; //重置当前数
}
}
for(i=0;i<k;i++)
res += sum[i];
return res;
}
结果