题目链接
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;
}
京公网安备 11010502036488号