NYOJ 409 郁闷的C小加(三)

来源:互联网 发布:java连接ldap 编辑:程序博客网 时间:2024/06/09 07:03

题目信息:

郁闷的C小加(三)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为前缀和后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。
输入
第一行输入一个整数T,共有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
数据保证除数不会为0。
输出
对于每组测试数据输出结果包括三行,先输出转换后的前缀和后缀表达式,再输出计算结果,结果保留两位小数。
样例输入
21+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 <string.h>#include <math.h>#include <stack>using namespace std;stack <char>op;stack <double>num;void Rev(char s[], int len){int i;char t;for(i = 0; i < len / 2; i++){t = s[i];s[i] = s[len - 1 - i];s[len - 1 - i] = t;}}int main(){int T, i, j, k, f, len;double a, b, c, v;char s[1005], before[1005], after[1005];scanf("%d", &T);while(T--){j = 0;scanf("%s", &s[1]);s[0] = '(';len = strlen(s);s[len - 1] = ')';for(i = 0; i < len; i++){if(s[i] == '(')op.push(s[i]);else if(s[i] == ')'){while(op.top() != '('){a = num.top(); num.pop();b = num.top(); num.pop();switch(op.top()){case '+': c = b + a; break;case '-': c = b - a; break;case '*': c = b * a; break;case '/': c = b / a; break;}num.push(c);after[j++] = ' ';after[j++] = op.top();op.pop();}op.pop();}else if(s[i] == '+' || s[i] == '-'){while(op.top() != '('){a = num.top(); num.pop();b = num.top(); num.pop();switch(op.top()){case '+': c = b + a; break;case '-': c = b - a; break;case '*': c = b * a; break;case '/': c = b / a; break;}num.push(c);after[j++] = ' ';after[j++] = op.top();op.pop();}op.push(s[i]);after[j++] = ' ';}else if(s[i] == '*' || s[i] == '/'){if(op.top() == '*'){a = num.top(); num.pop();b = num.top(); num.pop();num.push(b * a);after[j++] = ' ';after[j++] = op.top();op.pop();}else if(op.top() == '/'){a = num.top(); num.pop();b = num.top(); num.pop();num.push(b / a);after[j++] = ' ';after[j++] = op.top();op.pop();}op.push(s[i]);after[j++] = ' ';}else{v = 0;f = 0;while(s[i] <= '9' && s[i] >= '0' || s[i] == '.'){after[j++] = s[i];if(s[i] == '.'){f = i;}else{v = v * 10 + s[i] - '0';}i++;}i--;if(f == 0){num.push(v);}else{num.push(v/pow(10,i-f));}}}Rev(s, len);k = 0;for(i = 0; i < len; i++){if(s[i] == ')')op.push(s[i]);else if(s[i] == '('){while(op.top() != ')'){before[k++] = ' ';before[k++] = op.top();op.pop();}op.pop();}else if(s[i] == '+' || s[i] == '-'){while(op.top() == '*' || op.top() == '/'){before[k++] = ' ';before[k++] = op.top();op.pop();}op.push(s[i]);before[k++] = ' ';}else if(s[i] == '*' || s[i] == '/'){op.push(s[i]);before[k++] = ' ';}else {before[k++] = s[i];}}Rev(before, k);for(i = 0; i < k; i++){printf("%c", before[i]);}printf(" =\n");for(i = 0; i < j; i++){printf("%c", after[i]);}printf(" =\n");printf("%.2lf\n",num.top());}return 0;}


0 0
原创粉丝点击