郁闷的C小加(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描述
-
聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。
- 输入
- 第一行输入一个整数T,共有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
数据保证除数不会为0。 - 输出
- 对于每组测试数据输出结果包括两行,先输出转换后的后缀表达式,再输出计算结果,结果保留两位小数。两组测试数据之间用一个空行隔开。
- 样例输入
-
2 1+2= (19+21)*3-4/5=
- 样例输出
-
12+= 3.00 1921+3*45/-= 119.20
-
1 #include<stdio.h> 2 #include<string.h> 3 #include<stack> 4 #include<stdlib.h> 5 using namespace std; 6 7 char a[1010]; 8 char b[1010]; 9 stack <char> s1; 10 stack <float> s2; 11 12 int i,j,n,m,t; 13 float x,y,z; 14 15 int fun(char x) 16 { 17 switch(x) 18 { 19 case '+' : 20 case '-' :return 1; 21 case '*' : 22 case '/' :return 2; 23 case '(' :return 0; 24 default :return -1; 25 } 26 } 27 28 float js(float x,float y,char z) 29 { 30 switch(z) 31 { 32 case '+':return y+x; 33 case '-':return y-x; 34 case '*':return y*x; 35 default :return y/x; 36 } 37 } 38 39 int main() 40 { 41 int p; 42 char c[1010]; 43 float d; 44 scanf("%d",&t); 45 s1.push('#'); 46 while(t--) 47 { 48 j=0; 49 scanf("%s",a); 50 m=strlen(a)-1; 51 for(i=0;i<m;i++) 52 { 53 if(a[i]>='0'&&a[i]<='9'||a[i]=='.') 54 { 55 memset(c,0,sizeof(c)); 56 p=0; 57 while(a[i]>='0'&&a[i]<='9'||a[i]=='.') 58 { 59 b[j++]=a[i]; 60 c[p++]=a[i++]; 61 } 62 d=atof(c); 63 s2.push(d); 64 i--; 65 } 66 67 else if(a[i]=='(') s1.push(a[i]); 68 69 else if(a[i]==')') 70 { 71 while(s1.top()!='(') 72 { 73 b[j++]=s1.top(); 74 x=s2.top();s2.pop(); 75 y=s2.top();s2.pop(); 76 x=js(x,y,b[j-1]); 77 s2.push(x); 78 s1.pop(); 79 } 80 s1.pop(); 81 } 82 83 else 84 { 85 while(fun(s1.top())>=fun(a[i])) 86 { 87 b[j++]=s1.top(); 88 x=s2.top();s2.pop(); 89 y=s2.top();s2.pop(); 90 x=js(x,y,b[j-1]); 91 s2.push(x); 92 s1.pop(); 93 } 94 s1.push(a[i]); 95 } 96 } 97 98 while(s1.top()!='#') 99 { 100 b[j++]=s1.top(); 101 x=s2.top();s2.pop(); 102 y=s2.top();s2.pop(); 103 x=js(x,y,b[j-1]); 104 s2.push(x); 105 s1.pop(); 106 } 107 b[j]='='; 108 b[j+1]='\0'; 109 puts(b); 110 printf("%.2f\n",s2.top()); 111 s2.pop(); 112 } 113 return 0; 114 }