前缀式计算
时间限制: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;
1 /* 2 Name: NYOJ--128--前缀式计算 3 Copyright: 4 Author: 日天大帝 5 Date: 01/05/17 18:09 6 Description: 学C++这么久了,还是只会C的部分,看了别人代码,惭愧了 7 */ 8 #include<iostream> 9 #include<iomanip> 10 #include<string> 11 #include<sstream> 12 using namespace std; 13 stringstream ss; 14 double ans; 15 double f(){ 16 char ch; 17 ss>>ch; 18 if(ch == '+')return f()+f(); 19 else if(ch == '-')return f()-f(); 20 else if(ch == '*')return f()*f(); 21 else if(ch == '/')return f()/f(); 22 ss.unget(); 23 ss>>ans; 24 return ans; 25 } 26 int main(){ 27 ios::sync_with_stdio(false); 28 29 string str; 30 while(getline(cin,str)){ 31 ss.clear(); 32 ss<<str; 33 cout<<setiosflags(ios::fixed) 34 <<setprecision(2) 35 <<f()<<endl; 36 } 37 return 0; 38 }