题目链接

https://ac.nowcoder.com/acm/problem/16539

解题思路

(大佬思路及代码比较好理解)
大佬解题思路:
奇数位永远是整数,偶数位永远是符号(精髓);
利用这一特性我们输入的时候就无需通过循环确定整数了;
只定义一个数栈,用于存储每一个整数,遇到乘号就算出栈顶俩数的乘积压回栈中;
最后通过循环把栈中的数都加起来,就是答案(精髓)
大佬利用了本题的特性达到了简化的目的:
表达式简单,只有与+操作符。
我的解题思路:
debug了巨久,没想到自己能AC,栈这里我一直反应不过来
我的思路比较一般化,任何表达式求值都可以通过我的思路解决:
开俩栈,一栈存数,一栈存符;
遇数压栈,遇符比较与栈顶的符号的优先级(建议百度一下,有点麻烦),若高于栈顶则压栈,反之弹出数栈栈顶的俩数计算,结果压回。
最后循环计算清符栈,输出数栈栈顶。
*还是大佬牛币!**

我的AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e4;
string str;
stack<ll> num;
stack<char> op;
int main(){
    getline(cin,str);
    ll n=str.length();
    for(ll i=0;i<n;i++){
        if(isdigit(str[i])) {
            ll tmp=0;
            while(isdigit(str[i])) tmp=str[i++]-'0'+tmp*10;
            num.push(tmp%mod);
            i--;
        }
        else {
            while(!op.empty() && str[i]>=op.top()){//ASCII码的比较
                ll num1=num.top();num.pop();
                ll num2=num.top();num.pop();
                if(op.top()=='+') num.push((num1+num2)%mod);
                else num.push(num1*num2%mod);
                op.pop();
            }
            op.push(str[i]);
        }
    }

    while(!op.empty()){
        ll num1=num.top();num.pop();
        ll num2=num.top();num.pop();
        if(op.top()=='+') num.push((num1+num2)%mod);
        else num.push(num1*num2%mod);
        op.pop();    
    }

    cout<<num.top()%mod;
}

大佬AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e4;
stack<ll> num;
int main(){
    ll t=0,tnum=0,ans=0;
    char ch;
    while(++t){
        if(t&1LL) {
            cin>>tnum;
            num.push(tnum%mod);
        }
        else {
            ch=getchar();
            if(ch!='+' && ch!='*') break;
            if(ch=='*') {
                cin>>tnum;t++;
                ll tmp=num.top();
                num.pop();
                num.push(tmp*tnum%mod);
            }
        }
    }
    while(!num.empty()){
        ans=(ans+num.top())%mod;
        num.pop();
    }
    cout<<ans<<endl;
}