/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(char* s ) {
// write code here
// 逆波兰转换,将中缀表达式转换成后缀表达式
int topIdx = 0; // 作为符号栈的栈顶索引值
char operator[100] = {0}; // 符号栈
char temp[100][10] = {0};
int m = 0, j = 0;
int len = strlen(s);
for(int i = 0; i < len ; i++) {
// 如果遇到乘号或者左括号,直接压入符号栈
if(s[i] == '*' || s[i] == '(') {
operator[topIdx++] = s[i];
// 如果遇到加减法
} else if(s[i] == '+' || s[i] == '-') {
// 判断栈顶符号是否是乘号,如果是乘号
if(operator[topIdx - 1] == '*') {
// 当栈顶符号不为左括号或者栈空时
while(operator[--topIdx] != '(' && topIdx >= 0) {
// 我们将栈顶的符号倒入temp数组中
temp[j++][0] = operator[topIdx];
}
// 然后将栈顶的符号设为s[i]
operator[++topIdx] = s[i];
// 然后移动栈顶索引到下一个位置,方便下一个符号入栈
topIdx++;
}
else {
// 对于栈顶符号不是乘号的情况,我们直接将符号入栈
operator[topIdx++] = s[i];
}
// 如果遇到右括号
} else if(s[i] == ')') {
// 如果栈顶符号不是左括号或者空的时候
while(operator[--topIdx] != '(' && topIdx >= 0) {
// 我们将栈中的左括号之后的符号都倒入temp栈中
temp[j++][0] = operator[topIdx];
}
// 如果不是加减乘括号,就是数字
} else {
temp[j][m++] = s[i];
// 如果下一位不是数字了,那么j索引加一方便接收下一个数字
// m索引变为0,从0开始接收数字
if((s[i + 1] < '0' || s[i + 1] > '9') && i < len -1) {
j++;
m = 0;
// 如果下一位没有(到达字符串结尾),那么j索引加1
} else if(i == len - 1) {
j++;
}
}
}
// 逆波兰表达式中,出现连续的减号时,除了第一个减号剩余的减号都要转换成加号。
for(int i = 0, j = 1; i < topIdx; i++) {
if(operator[i] == '-') {
while(operator[i + j] == '-' && (i + j) < topIdx) {
operator[i + j++] = '+';
}
}
}
int lenoftemp = 0;
if(topIdx != 0) {
for(int i = topIdx - 1; i >= 0; i--) {
// 将所有符号栈中剩余的符号都倒入temp栈中
temp[j++][0] = operator[i];
}
lenoftemp = j;
}
// 用逆波兰表达式求解最终结果
int result = 0;
int integer[100];
for(int i = 0, topIdx = 0; i < lenoftemp; i++) {
// 如果遇到什么符号,我们执行什么运算
// 注意是先加入栈的数字,减去后加入栈的数字
if(strcmp(temp[i], "+") == 0) {
result = integer[topIdx - 2] + integer[topIdx - 1];
topIdx--;
integer[topIdx - 1] = result;
} else if(strcmp(temp[i], "*") == 0) {
result = integer[topIdx - 2] * integer[topIdx - 1];
topIdx--;
integer[topIdx - 1] = result;
} else if(strcmp(temp[i], "-") == 0) {
result = integer[topIdx - 2] - integer[topIdx - 1];
topIdx--;
integer[topIdx - 1] = result;
// 如果遇到了数字,我们将数字放入一个新的integer栈中
} else {
integer[topIdx++] = atoi(temp[i]);
}
}
return integer[0];
}