題前廢話:
咱也不知道咱寫了個什么神奇的代碼導致_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!='\n'){ ch=getchar();//然后讀入運算符 if(ch=='\n') 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!='\n'){ ch=getchar(); if(ch=='\n') 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-