表达式求值
表达式求值
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)-
输入
-
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
- 每组都输出该组运算式的运算结果,输出结果保留两位小数。 样例输入
-
2 1.000+2/4= ((1+2)*5+1)/4=
样例输出
-
1.50 4.00
-
#include <stdio.h> #include <string.h> #define M 1000 typedef struct data { double digital[M]; int top; }Data; typedef struct Str { char string[M]; int top; }Str; void pop_data(Data *p, char s); void pop_str(Str *p); int main() { int n = 0, i = 0, lens = 0, j; double d = 0; char s[M], a[M]; Data data; Str str; scanf("%d", &n); getchar(); while(n--) { str.top = 0; data.top = 0; memset(str.string, '\0', M); memset(data.digital, -1, M); str.string[0] = '='; str.top++; memset(s, '\0', M); memset(a, '\0', M); gets(s); lens = strlen(s); j = 0; for(i = 0; i < lens; i++) { if((s[i] >= '0' && s[i] <= '9') || s[i] == '.' ) a[j++] = s[i]; else if(s[i] == '*' || s[i] == '/') { if(a[0] != '\0') { sscanf(a, "%lf", &d); data.digital[data.top++] = d; memset(a, '\0', M); j = 0; } if(str.string[str.top - 1] == '*' || str.string[str.top - 1] == '/') { pop_data(&data, str.string[str.top - 1]); pop_str(&str); } str.string[str.top++] = s[i]; } else if(s[i] == '(') str.string[str.top++] = s[i]; else if(s[i] == '+' || s[i] == '-' || s[i] == '=') { if(a[0] != '\0') { sscanf(a, "%lf", &d); data.digital[data.top++] = d; memset(a, '\0', M); j = 0; } if(str.string[str.top - 1] == '*' || str.string[str.top - 1] == '/' || s[i] == '=') { pop_data(&data, str.string[str.top - 1]); pop_str(&str); } else if(str.string[str.top - 1] == '+' || str.string[str.top - 1] == '-') { pop_data(&data, str.string[str.top - 1]); pop_str(&str); } if(s[i] == '=' && str.string[str.top - 1] != '=') { pop_data(&data, str.string[str.top - 1]); pop_str(&str); } if(str.string[str.top - 1] == '+' || str.string[str.top - 1] == '-') { pop_data(&data, str.string[str.top - 1]); pop_str(&str); } str.string[str.top++] = s[i]; } else if(s[i] == ')') { if(a[0] != '\0') { sscanf(a, "%lf", &d); data.digital[data.top++] = d; memset(a, '\0', M); j = 0; } pop_data(&data, str.string[str.top - 1]); str.string[str.top - 1] = '\0'; if(str.string[str.top - 2] != '(') { pop_data(&data, str.string[str.top - 2]); pop_str(&str); } str.string[str.top - 1] = '\0'; str.string[str.top - 2] = '\0'; str.top -= 2; } } printf("%.2f\n", data.digital[0]); } return 0; } void pop_data(Data *p, char s) { switch(s) { case '+': p->digital[p->top - 2] = p->digital[p->top - 2] + p->digital[p->top - 1]; break; case '-': p->digital[p->top - 2] = p->digital[p->top - 2] - p->digital[p->top - 1]; break; case '*': p->digital[p->top - 2] = p->digital[p->top - 2] * p->digital[p->top - 1]; break; default : p->digital[p->top - 2] = p->digital[p->top - 2] / p->digital[p->top - 1]; } p->digital[p->top - 1] = -1; p->top--; } void pop_str(Str *p) { p->string[p->top - 1] = '\0'; p->top--; }
-
第一行输入一个整数n,共有n组测试数据(n<10)。