表达式求值(二)
来源:互联网 发布:最优化方法答案施光燕 编辑:程序博客网 时间: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--;}
- 表达式求值(二)
- 表达式求值(二)
- 数据结构——表达式求值(二)
- 实验二 栈-表达式求值
- 栈的应用之表达式求值(二)
- 表达式求值(上)
- 表达式求值(中)
- 表达式求值(下)
- 四则运算(表达式求值)
- 表达式求值(char)
- 表达式求值(nyoj305)
- 表达式求值(一)
- 表达式求值(nyoj305)
- 表达式求值(一)
- 表达式求值(栈)
- 表达式求值(OJ)
- 表达式求值(数据结构)
- 表达式求值(蓝桥杯)
- sTM32F10X SPI操作flash MX25L64读写数据
- vs重定向输出
- spring mvc重复提交解决办法
- android 疑难杂症 综合
- spring+mybatis利用interceptor(plugin)兑现数据库读写分离
- 表达式求值(二)
- 【Cocos2d-x 3.0学习笔记】coco2d-s 读取plist 文件报错
- Android不同版本的Dialog的行为不同
- Windows Store 平台移植 —— (3) 补充基础功能 API
- 【ios 模块1】zip Unzip 方法以及其中的坑
- python namedtuple
- yii 数据排序
- Windows Store 平台移植 —— (4) 补充文件系统 API
- 关于使用反射无法取得部分注解