1959: 郁闷的C小加(二)
2017-08-10 16:53
169 查看
1959: 郁闷的C小加(二)
时间限制: 1 Sec 内存限制: 64 MB提交: 5 解决: 3
[提交][状态][讨论版][Edit]
[TestData]
题目描述
聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。输入
第一行输入一个整数T,共有T组测试数据(T<10)。 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。 数据保证除数不会为0。输出
对于每组测试数据输出结果包括两行,先输出转换后的后缀表达式,再输出计算结果,结果保留两位小数。两组测试数据之间用一个空行隔开。样例输入
21+2=(19+21)*3-4/5=
样例输出
12+=3.001921+3*45/-=119.20
提示
nyoj267注意计算时操作数的计算顺序,先进的数为第一个操作数,后进的为第二个操作数,wa很久;
#include<stdio.h> #include<algorithm> #include<string.h> #include<stack> #include <cstdlib> #include<cctype> using namespace std; char str[1009]={0}; void compute(stack<double>& Num,stack<char>& Op) { double b = Num.top(); Num.pop(); double a = Num.top(); Num.pop(); switch(Op.top()) { case '+': Num.push(a+b); break; case '-': Num.push(a-b); break; case '*': Num.push(a*b); break; case '/': Num.push(a/b); break; } Op.pop();//计算出结果,运算符号 出栈 } double yunsuan(double a,double b,char c){ if(c=='+') return a+b; if(c=='-') return a-b; if(c=='*') return a*b; if(c=='/') return (a*1.0/b); } //优先级 int check(char a){ if(a=='+'||a=='-') return 1; if(a=='*'||a=='/') return 2; else return 0; } //中缀转换后缀 void trans(){ stack<char>st; st.push('#'); for(int i=0;i<strlen(str);i++) { if(isdigit(str[i])) { char a[1000]={0}; sscanf(str+i,"%[0-9.]",a); printf("%s",a); i+=strlen(a)-1; } else if(str[i]=='(') st.push('('); else if(str[i]==')') { while(st.top()!='('&&st.size()!=1) { printf("%c",st.top()); st.pop(); } st.pop(); } else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/') { while(check(st.top())>=check(str[i]))//不处理最后的等号 { printf("%c",st.top()); st.pop(); } st.push(str[i]); } } while(st.top()!='#') { printf("%c",st.top()); st.pop(); } printf("=\n"); } //中缀计算 void cal(){ stack<char>fuhao; stack<double>num; for(int i=0;i<strlen(str);i++) { if(str[i]>='0'&&str[i]<='9') { char a[500]={0}; sscanf(str+i,"%[0-9.]",a); i+=strlen(a)-1; double b;// b=atof(a); num.push(b); } else if(str[i]=='(') { fuhao.push(str[i]); } else if(str[i]==')') { while(fuhao.top()!='(') { double b=num.top(); num.pop(); double a=num.top(); num.pop(); char ch=fuhao.top(); fuhao.pop(); num.push(yunsuan(a,b,ch)); } fuhao.pop();//'('出栈 } else if(fuhao.empty()||check(str[i])>check(fuhao.top())) fuhao.push(str[i]); else { while(!fuhao.empty()&&check(str[i])<=check(fuhao.top())) { double b = num.top();//后进的做操作数 即第二个数 num.pop(); double a = num.top();//先进的做被操作数 ,即第一个数 num.pop(); char ch=fuhao.top(); fuhao.pop(); num.push(yunsuan(a,b,ch)); //compute(num,fuhao); } fuhao.push(str[i]); } } printf("%.2lf\n",num.top()); } int main(){ int t; scanf("%d",&t); while(t--){ memset(str,0,sizeof(str)); scanf("%s",str); trans(); cal(); printf("\n"); } }
相关文章推荐
- NYOJ 267 郁闷的C小加(二)
- NYOJ 267(郁闷的C小加(二)) 后缀表达式求值
- NYOJ 257 郁闷的C小加(一)
- 郁闷的C小加(二)
- nyoj267郁闷的c小加 中缀表达式转后缀求值
- nyoj 467 中缀式变后缀式 nyoj 257 郁闷的C小加(一)
- nyoj-409 郁闷的C小加(三) (表达式求值,中缀式转前缀式,中缀式转后缀式)
- NYOJ--郁闷的C小加(一)
- 郁闷的C小加(一)
- NYOJ 257 郁闷的C小加(一) (栈 、中缀转后缀)
- nyoj 题目409 郁闷的C小加(三)
- 郁闷的C小加(三)(nyoj 409)
- 郁闷的C小加(三)
- NYOJ XYNUYOJ 郁闷的c小加(一)(数据结构)
- 郁闷的C小加(三)中缀转前后缀并计算
- nyoj_257 郁闷的c小加
- NYOJ-267 郁闷的C小加(二)
- 中缀式转后缀表达式 -NYOJ 题目267郁闷的C小加(二)
- 郁闷的C小加(三) 409
- 郁闷的C小加(一)