描述
聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。
-
输入
-
第一行输入一个整数T,共有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
数据保证除数不会为0。
输出
- 对于每组测试数据输出结果包括两行,先输出转换后的后缀表达式,再输出计算结果,结果保留两位小数。两组测试数据之间用一个空行隔开。 样例输入
-
21+2=(19+21)*3-4/5=
样例输出
-
12+=3.001921+3*45/-=119.20
还是 atof 准确。。。
#include <stdio.h> #include <stack> #include <iostream> #include <string.h> #include <stdlib.h> using namespace std; char cmp(char s1,char s2) { if((s1 == '+')||(s1 == '-')) { if((s2 == '*')||(s2 == '/')||(s2 == '(')) return '<'; else return '>'; } else if((s1 == '*')||(s1 == '/')) { if(s2 == '(') return '<'; else return '>'; } else if(s1 == '(') { if(s2 == ')') return '='; else return '<'; } else if((s1 == ')')||(s1 == '=')) return '<'; } int main() { stack<char>str; stack<float>num; char s[1010],c,s1[50]; str.push('='); int i,len,j,k,test,flag; float temp,a,b,t; scanf("%d",&test); for(j=1;j<=test;j++) { temp = 0; flag = 0; k = 0; scanf("%s",s); len = strlen(s); for(i=0;i<len;) { if((str.top()=='=')&&(s[i]=='=')) { printf("=\n"); break; } if(isdigit(s[i])||s[i] == '.') { flag = 1; printf("%c",s[i]); s1[k++] = s[i++]; continue; } if(flag) { s1[k] = '\0'; temp = atof(s1); num.push(temp); flag = 0; k = 0; } switch(cmp(str.top(),s[i])) { case '<': str.push(s[i]); i++; break; case '=': str.pop(); i++; break; case '>': c = str.top(); str.pop(); printf("%c",c); a = num.top(); num.pop(); b = num.top(); num.pop(); if(c == '+') b += a; else if(c == '-') b -= a; else if(c == '*') b *= a; else if(c == '/') b /= a; num.push(b); cmp(str.top(),s[i]); break; } } temp = num.top(); if(j!=test) printf("%.2f\n\n",temp); else printf("%.2f\n",temp); } return 0; }