描述
啦啦啦。作为一个苦逼的程序猿。?。请看下图。。。
现在老总想让你帮他儿子写个简单计算器(他儿子小学3年级,嘘!),写不出来就扣奖金。。快帮他写吧。。。
给一个包含+-*/()的正确的表达式。要你计算它的结果。
除法的规则类似C/C++中取整除法。比如:9/5=1 10/5=2
其他规则参照现实。。。
输入
多组测试样例
一行字符串(长度小于200)
所有参与运算的数字都为小于1000正整数。
表达式中存在空格。
数据保证合法。
输出
一行
表达式的结果
样例输入
1+2
3+(5-6/(1+2)+10)*8
样例输出
3
107
提示
←_←
话说我的样例很良心啊。
思路:很久以前西南民大比赛做过的题,其实就是给你一个表达式让你求值,我们可以先将它变成波兰式,然后波兰式求值就简单多了
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <string.h> 5 #include <stack> 6 #define maxn 100009 7 using namespace std; 8 stack<char>q; 9 stack<long long>p; 10 long long priorit[1000],ans[maxn],h; 11 bool opp[maxn]; 12 char ch[maxn]; 13 int main() 14 { 15 priorit[(int)'+']=priorit[(int)'-']=1; 16 priorit[(int)'*']=priorit[(int)'/']=2; 17 priorit[(int)'(']=0; 18 while(gets(ch+1)!=NULL) 19 { 20 while(!q.empty())q.pop(); 21 while(!p.empty())p.pop(); 22 h=0; 23 memset(ans,0,sizeof(ans)); 24 memset(opp,0,sizeof(opp)); 25 long long len=strlen(ch+1),idx=1,j=1; 26 for(int i=1;i<=len;i++) 27 { 28 if(ch[i]!=' ')ch[j++]=ch[i]; 29 } 30 len=j-1; 31 while(idx<=len) 32 { 33 long long num=0,flag=0; 34 while(ch[idx]>='0'&&ch[idx]<='9'&&idx<=len) 35 { 36 num=num*10+ch[idx++]-'0'; 37 flag=1; 38 } 39 if(flag==0) 40 { 41 if(ch[idx]=='(')q.push('('); 42 else if(ch[idx]==')') 43 { 44 while(!q.empty()&&q.top()!='(') 45 { 46 ans[++h]=-(long long)q.top(); 47 opp[h]=1; 48 q.pop(); 49 } 50 q.pop(); 51 } 52 else 53 { 54 while(!q.empty()&&priorit[(long long)q.top()]>=priorit[(int)ch[idx]]) 55 { 56 ans[++h]=-(int)q.top(); 57 opp[h]=1; 58 q.pop(); 59 } 60 q.push(ch[idx]); 61 } 62 } 63 else 64 { 65 ans[++h]=num; 66 } 67 if(flag==0)idx++; 68 } 69 while(!q.empty()) 70 { 71 ans[++h]=-(long long)q.top(); 72 opp[h]=1; 73 q.pop(); 74 } 75 for(int i=1;i<=h;i++) 76 { 77 // printf("%I64d ",ans[i]); 78 if(opp[i]==0)p.push(ans[i]); 79 else 80 { 81 long long u=p.top(); 82 p.pop(); 83 long long v=p.top(); 84 p.pop(); 85 if(ans[i]==-(int)'-')p.push(v-u); 86 if(ans[i]==-(int)'+')p.push(u+v); 87 if(ans[i]==-(int)'*')p.push(u*v); 88 if(ans[i]==-(int)'/')p.push(v/u); 89 } 90 } 91 if(!p.empty())printf("%I64d ",p.top()); 92 else printf("0 "); 93 } 94 }