表达式求值(二)

来源:互联网 发布:最优化方法答案施光燕 编辑:程序博客网 时间:2024/05/18 03:23

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
21.000+2/4=((1+2)*5+1)/4=
样例输出
1.504.00
 #include <stdio.h>#include <string.h>#define M 1000typedef 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--;}        


原创粉丝点击