/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回表达式的值
 * @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];
}