nyist 35 表达式求值
2016-10-06 13:28
253 查看
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
样例输出
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<bits/stdc++.h> #include<stack> const int MAX=10005; using namespace std; char pp[MAX];//存储转换后的后缀表达式 void trans(char *str)//将中缀表达式转换后缀表达式 { stack<char>ss; int i,j; i=0; j=0; while(str[i]!='=') { if(str[i]=='(') { ss.push(str[i]); } else if(str[i]==')') { while(ss.top()!='(') { pp[j++]=ss.top(); ss.pop(); } ss.pop(); } else if(str[i]=='+'||str[i]=='-') { while(!ss.empty()&&ss.top()!='(') { pp[j++]=ss.top(); ss.pop(); } ss.push(str[i]); } else if(str[i]=='*'||str[i]=='/') { while((!ss.empty()&&ss.top()=='*')||(!ss.empty()&&ss.top()=='/')) { pp[j++]=ss.top(); ss.pop(); } ss.push(str[i]); } else if(str[i]==' ') { i++; continue; } else { while((str[i]>='0'&&str[i]<='9')||str[i]=='.') { pp[j++]=str[i]; i++; } i--; pp[j++]='='; } i++; } while(!ss.empty()) { pp[j++]=ss.top(); ss.pop(); } pp[j]='='; // for(int k=0; k<=j; k++)//输出转化后的后缀表达式 // { // printf("%c",pp[k]); // } // printf("\n"); } void compvalue()//计算后缀表达式的值 { double d,d1; stack<double>mm; int i; i=0; while(pp[i]!='=') { if(pp[i]=='+') { double r=mm.top(); mm.pop(); double l=mm.top(); mm.pop(); double result=l+r; mm.push(result); } else if(pp[i]=='-') { double r=mm.top(); mm.pop(); double l=mm.top(); mm.pop(); double result=l-r; mm.push(result); } else if(pp[i]=='*') { double r=mm.top(); mm.pop(); double l=mm.top(); mm.pop(); double result=l*r; mm.push(result); } else if(pp[i]=='/') { double r=mm.top(); mm.pop(); double l=mm.top(); mm.pop(); double result=l/r; mm.push(result); } else { d=0; d1=0; while(pp[i]>='0'&&pp[i]<='9') { d=10*d+pp[i]-'0'; i++; } if(pp[i]=='.') { i++; double f=0; while(pp[i]>='0'&&pp[i]<='9') { f=f+1; d1+=(pp[i]-'0')*(double)(1/(pow(10,f))); i++; } } d=d+d1; mm.push(d); } i++; } printf("%.2lf\n",mm.top()); } int main() { char str[MAX]; int n; scanf("%d\n",&n); while(n--) { gets(str); trans(str); compvalue(); } return 0; }
相关文章推荐
- 网易2017春招笔试——奇怪的表达式求值
- 中缀表达式转换成后缀表达式并求值
- 表达式求值
- Drools, IKExpression, Aviator和Groovy字符串表达式求值比较
- hrbust 1523 表达式求值+dfs
- 四则运算表达式求值程序(C语言版)
- 表达式求值问题(包含两位数)
- [C] 关于表达式求值
- 11、数据结构笔记之十一栈的应用之表达式求值实现
- C/C++ 语言中的表达式求值
- 具有表达式求值功能的计算器软件设计
- 7.12.1: spel---使用expression接口进行表达式求值
- NYOJ - 35 表达式求值
- 简单算术表达式求值
- 计蒜客-表达式求值
- Java 字符串算术表达式求值
- 中缀表达式到逆波兰表达式的转换及求值
- 表达式求值-栈和队列的应用
- C语言数据结构之逆波兰表达式求值
- loadstring表达式求值(lua语言)