题目链接
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; }