C 郁闷的C小加(三)
内存限制:64MB 时间限制:1s Special Judge: No
题目描述:
聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。
输入描述:
第一行输入一个整数T,共有T组测试数据(T<10)。 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。 数据保证除数不会为0。
输出描述:
对于每组测试数据输出结果包括三行,先输出转换后的前缀和后缀表达式,再输出计算结果,结果保留两位小数。
样例输入:
复制
2 1+2= (19+21)*3-4/5=
样例输出:
+ 1 2 = 1 2 + = 3.00 - * + 19 21 3 / 4 5 = 19 21 + 3 * 4 5 / - = 119.20
#include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define ll long long using namespace std; char s[1100]; char sss[1100]; char ss[1100]; char buf[1100]; int aa(char a) { switch(a) { case '-': case '+': return 1; break; case '/': case '*': return 2; break; case '(': return 0; break; case ')': return -1; break; default: return -2; } } double bb(char op,double k1,double k2) { double k; switch (op) { case '+': k = k1+k2; break; case '-': k = k1-k2; break; case '*': k = k1*k2; break; case '/': k = k1/k2; break; } return k; } int main() { int n; int o; scanf("%d",&n); while(n--) { stack<char>q; stack<double>p; o=0; scanf("%s",s); int k=strlen(s)-1; memset(sss,0,sizeof(sss)); for(int i=0;i<k;i++) sss[i]=s[k-1-i]; for(int i=0;i<k;i++) { if(aa(sss[i])==-1) { q.push(sss[i]); continue; } if(aa(sss[i])==-2) { ss[o++]=' '; sscanf(sss+i,"%[^=()+*/-]",buf); for(int j=0;j<strlen(buf);j++) ss[o++]=buf[j]; i+=strlen(buf)-1; continue; } if(aa(sss[i])==0) { while(!q.empty()) { char u=q.top(); q.pop(); if(aa(u)==-1) break; ss[o++]=' '; ss[o++]=u; } continue; } while(!q.empty()) { char u=q.top(); if(aa(u)>aa(sss[i])) { ss[o++]=' '; ss[o++]=u; q.pop(); } else break; } q.push(sss[i]); } while(!q.empty()) { char u=q.top(); ss[o++]=' '; ss[o++]=u; q.pop(); } for(int i=o-1;i>=0;i--) printf("%c",ss[i]); printf("=\n"); o=0; for(int i=0;i<k;i++) { if(aa(s[i])==0) { q.push(s[i]); continue; } if(aa(s[i])==-2) { sscanf(s+i,"%[^=()+*/-]",buf); for(int j=0;j<strlen(buf);j++) ss[o++]=buf[j]; ss[o++]=' '; i+=strlen(buf)-1; double kk=atof(buf); p.push(kk); continue; } if(aa(s[i])==-1) { while(!q.empty()) { char u=q.top(); q.pop(); if(aa(u)==0) break; ss[o++]=u; ss[o++]=' '; double k1=p.top(); p.pop(); double k2=p.top();p.pop(); p.push(bb(u,k2,k1)); } continue; } while(!q.empty()) { char u=q.top(); if(aa(u)>=aa(s[i])) { ss[o++]=u; ss[o++]=' '; double k1=p.top(); p.pop(); double k2=p.top();p.pop(); p.push(bb(u,k2,k1)); q.pop(); } else break; } q.push(s[i]); } while(!q.empty()) { char u=q.top(); ss[o++]=u; ss[o++]=' '; q.pop(); double k1=p.top(); p.pop(); double k2=p.top();p.pop(); p.push(bb(u,k2,k1)); } for(int i=0;i<o;i++) printf("%c",ss[i]); printf("=\n"); printf("%.2lf\n",p.top()); } }