前缀式计算
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
先说明一下什么是中缀式:
如2+(3+4)*5这种我们最常见的式子就是中缀式。
而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))
然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )
把括号去掉就是:+ 2 * + 3 4 5
最后这个式子就是该表达式的前缀表示。
给你一个前缀表达式,请你计算出该前缀式的值。
比如:
+ 2 * + 3 4 5的值就是 37
- 输入
- 有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。 - 输出
- 对每组数据,输出该前缀表达式的值。输出结果保留两位小数。
- 样例输入
-
+ 2 * + 3 4 5 + 5.1 / 3 7
- 样例输出
-
37.00 5.53
知识点:
stringstream可以把string转换成double,int,long long等
unget()可以把读出的字符放回字符串流中
atof在stdlib.h中的把str字符串转换成double
atoi在stdlib.h中的把str字符串转换成int;
/* Name: NYOJ--128--前缀式计算 Copyright: Author: 日天大帝 Date: 01/05/17 18:09 Description: 学C++这么久了,还是只会C的部分,看了别人代码,惭愧了 */ #include<iostream> #include<iomanip> #include<string> #include<sstream> using namespace std; stringstream ss; double ans; double f(){ char ch; ss>>ch; if(ch == '+')return f()+f(); else if(ch == '-')return f()-f(); else if(ch == '*')return f()*f(); else if(ch == '/')return f()/f(); ss.unget(); ss>>ans; return ans; } int main(){ ios::sync_with_stdio(false); string str; while(getline(cin,str)){ ss.clear(); ss<<str; cout<<setiosflags(ios::fixed) <<setprecision() <<f()<<endl; } ; }
#include<iostream> #include<string> #include<stdio.h> using namespace std; int pos;string str; double fun() { ++pos; if(str[pos]==' ')++pos; ') { string s; while(pos!=str.size()&&str[pos]!=' ') s+=str[pos++]; double tp; sscanf(s.c_str(),"%lf",&tp); return tp; } if(str[pos]=='+') return fun()+fun(); if(str[pos]=='-') return fun()-fun(); if(str[pos]=='*') return fun()*fun(); if(str[pos]=='/') return fun()/fun(); } int main() { while(getline(cin,str)) { pos=-; printf("%.2lf\n",fun()); } }
#include<iostream> #include<string> #include<stdio.h> #include<sstream> #include<stdlib.h> using namespace std; stringstream ss;//字符串流 double fun() { char ch; double tp; ss>>ch; if(ch=='+') return fun()+fun(); if(ch=='-') return fun()-fun(); if(ch=='*') return fun()*fun(); if(ch=='/') return fun()/fun(); ss.unget();//把读出的ch字符放回ss字符串流中 ss>>tp; //从字符串流中读出double型数 return tp; } int main() { string str; while(getline(cin,str)) { ss.clear(); ss<<str; printf("%.2lf\n",fun()); } }
#include<iostream> #include<string> #include<stdio.h> #include<sstream> #include<stdlib.h> using namespace std; stringstream ss;//字符串流 double fun() { string str; ss>>str; ]=='+') return fun()+fun(); ]=='-') return fun()-fun(); ]=='*') return fun()*fun(); ]=='/') return fun()/fun(); return atof(str.c_str());//atof在stdlib.h中 把str字符串转换成double; //atoi在stdlib.h中 把str字符串转换成int; } int main() { string str; while(getline(cin,str)) { ss.clear(); ss<<str; printf("%.2lf\n",fun()); } }
#include<stdio.h> #include<stdlib.h> ]; double fun() { if(scanf("%s",str)==EOF) <<; ]=='+') return fun()+fun(); ]=='-') return fun()-fun(); ]=='*') return fun()*fun(); ]=='/') return fun()/fun(); return atof(str);//atof在stdlib.h中的把str字符串转换成double; //atoi在stdlib.h中的把str字符串转换成int; } int main() { ) { double tp=fun(); <<) printf("%.2lf\n",tp); else break; } }