郁闷的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
- 来源
- 改编自NYOJ
-
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <stack> 5 #include <cctype> 6 7 using namespace std; 8 9 char str[1005]; 10 stack<char> Optr; 11 stack<float> Opnd; 12 13 char judge(char c1, char c2) 14 { 15 if(c1 == '+' || c1 == '-') 16 { 17 if(c2 == '*' || c2 == '/' || c2 == '(') 18 return '<'; 19 else 20 return '>'; 21 } 22 if(c1 == '*' || c1 == '/') 23 { 24 if(c2 == '(') 25 return '<'; 26 return '>'; 27 } 28 if(c1 == '(' && c2 == ')' || c1 == '=' && c2 == '=') 29 return '='; 30 return '<'; 31 } 32 33 float cal(float num1, float num2, char p) 34 { 35 if(p == '+') 36 return num1 + num2; 37 else if(p == '-') 38 return num1 - num2; 39 else if(p == '*') 40 return num1 * num2; 41 else if(p == '/') 42 return num1 / num2; 43 } 44 45 void change() 46 { 47 int len = strlen(str); 48 while(!Opnd.empty()) 49 Opnd.pop(); 50 while(!Optr.empty()) 51 Optr.pop(); 52 Optr.push('='); 53 54 for(int i = 0; i < len;) 55 { 56 if(isdigit(str[i]) || str[i] == '.') 57 { 58 float t1 = 0; 59 int t2 = 1; 60 bool flag = false; 61 while(isdigit(str[i]) || str[i] == '.') 62 { 63 if(flag) 64 t2 *= 10; 65 if(isdigit(str[i])) 66 t1 = t1*10+str[i]-'0'; 67 else 68 flag = true; 69 printf("%c", str[i]); 70 ++i; 71 } 72 Opnd.push(t1/t2); 73 } 74 else 75 { 76 char tmp = judge(Optr.top(), str[i]); 77 if(tmp == '<') 78 { 79 Optr.push(str[i]); 80 ++i; 81 } 82 else if(tmp == '>') 83 { 84 tmp = Optr.top(); 85 printf("%c", tmp); 86 Optr.pop(); 87 float num1 = Opnd.top(); 88 Opnd.pop(); 89 float num2 = Opnd.top(); 90 Opnd.pop(); 91 Opnd.push(cal(num2, num1, tmp)); 92 //++i; 93 } 94 else 95 { 96 Optr.pop(); 97 ++i; 98 } 99 } 100 } 101 } 102 103 int main() 104 { 105 int T; 106 scanf("%d", &T); 107 while(T--) 108 { 109 scanf("%s", str); 110 change(); 111 printf("= %.2f ", Opnd.top()); 112 if(T) 113 printf(" "); 114 } 115 return 0; 116 }