本题字符串中符号最大达到100000,那么只用递归的方式去求解表达式的话就需要100000层的递归(会超时)。那么可以回到后缀表达式的思路。
使用op栈保存符号,num栈保存数字。在计算过程中遇到*就进行计算后把计算的结果压栈。重复这个过程就可以了。
要注意:题目要求当答案长度大于4位时,输出后四位。而且题目中给的数据范围是2^31-1,在计算过程中也会超过数据类型范围。采用取余的性质在计算过程中取余。
#include <bits/stdc++.h>

typedef long long ll;

using namespace std;

string s;
// ll string_to_num(int l, int r) {
//     ll ans = 0;
//     for (int i=l;i<=r;i++) {
//         ans = ans*10 + (s[i]-'0');
//     }
//     return ans;
// }

// ll calc(int l, int r) {
//     if (l>r) return 0;
//     int pos1 = -1, pos2 = -1;
//     for (int i=l;i<=r;i++) {
//         if (s[i]=='+') pos1 = i;
//         if (s[i]=='*') pos2 = i;
//     }
//     if (pos1==-1&&pos2==-1) {
//         return string_to_num(l, r);
//     }
//     if (pos1!=-1) return (calc(l, pos1-1)%10000+calc(pos1+1, r)%10000)%10000;
//     if (pos2!=-1) return (calc(l, pos2-1)%10000*calc(pos2+1, r)%10000)%10000;
//     return 0;
// }
const int p = 10000;
stack<int> num;
stack<char> op;
ll calc(int l, int r) {
    for (int i=l;i<=r;) {
        if (s[i]=='+'||s[i]=='*') {
            op.push(s[i]);
            i++;
        }
        else {
            int number = 0;
            int j = i;
            while (j<=r&&!(s[j]=='+'||s[j]=='*')) {
                number = number*10 + (s[j]-'0');
                j++;
                i++;
            }
            num.push(number);
            if (!op.empty() && op.top()=='*') {
                int ans = num.top();
                num.pop();
                ans = (ans%p * num.top()%p)%p;
                num.pop();
                num.push(ans);
                op.pop();
            }
        }
    }
    while (!op.empty()) {
        int ans = num.top();
        num.pop();
        ans = (ans%p + num.top()%p)%p;
        num.pop();
        num.push(ans);
        op.pop();
    }
    return num.top();
}

int main() {
    cin>>s;
    cout<<calc(0, s.size()-1)%10000;
    
    return 0;
}