题前废话:
咱也不知道咱写了个什么神奇的代码导致_rqy都看不明白它是怎么re掉的,
代码的大致思路是这样的:对于这样一个中缀表达式,先转化成它的后缀表达式的形式,然后利用P1449 后缀表达式 这道题的solution来求解这个式子,但是咱也不知道为啥咱也找不出来为啥,它的所有语句都是可以正常执行的,最后答案也求出来显示出来了,然后它就停止运行了呢???甚至于return 0(main函数中的)都可以执行呢qwq
贴一下代码吧,希望大佬们帮忙看一看啊qwq:
#include<bits/stdc++.h> using namespace std; int cnt,x,b,c,num; string a,d; stack<char> s1; stack<long long> s; int main(){ cin>>a; int len=a.size(); for(int i=0;i<len;i++){ if(a[i]>='0'&&a[i]<='9'){ d[cnt++]=a[i]; } else { if(a[i]=='+'||a[i]=='-'||a[i]=='*'){ char f=s1.top(); d[cnt++]='.'; if((a[i]=='+'||a[i]=='-')&&(f=='*')){ d[cnt++]=f; s1.pop(); } s1.push(a[i]); } } } d[cnt++]='.'; while(!s1.empty()){ d[cnt++]=s1.top(); s1.pop(); } for(int i=0;i<cnt;i++){ if(d[i]=='+'){x=s.top();s.pop();b=s.top();s.pop();c=x+b;s.push(c);} if(d[i]=='-'){x=s.top();s.pop();b=s.top();s.pop();c=b-x;s.push(c);} if(d[i]=='*'){x=s.top();s.pop();b=s.top();s.pop();c=x*b;s.push(c);} if(d[i]>='0'&&d[i]<='9'){ num*=10; num+=(d[i]-'0'); } if(d[i]=='.'&&num!=0) { s.push(num); num=0; } } cout<<s.top()%10000; }
好啦接下来是是正解:
SOLUTION:
首先这个读入就非常神奇啦诶:先读入一个数字(显然这个表达式只有数字和运算符号(+*)没题目描述没有-哦),然后读入就很神奇:
cin>>a;//先读入一个数字 a%=10000; while(ch!=' '){ ch=getchar();//然后读入运算符 if(ch==' ') break;//当读入的运算符是空格,显然读入完成了,break掉; cin>>b;
然后是思路:
首先也像转后缀表达式一样,建立一个stack(直接用stl了比较好写(不会手写)),将数字入栈,这里的操作是:如果读入的操作符是‘*’,那么将一个元素出栈,然后接下来会继续读入一个数字b嘛,将a*b%mod的值再放进栈中,这样只要是在栈中的数就只会进行加法运算而不会进行乘法运算,这样就保证了优先级;
最后把栈中所有的元素取出相加即为答案
CODE:
#include<bits/stdc++.h> using namespace std; long long a,b,ans; char ch; stack<long long> s; int main(){ cin>>a; a%=10000; s.push(a); while(ch!=' '){ ch=getchar(); if(ch==' ') break; cin>>b; if(ch=='*'){ a=s.top(); s.pop(); s.push(a*b%10000); } else s.push(b); } while(s.size()){ ans=(ans+s.top())%10000; s.pop(); } cout<<ans%10000<<endl; }
end-