波兰表达式
波兰表达式是一种把运算符前置的算术表达式。
例如普通的表达式2+3的逆波兰表示法为+ 2 3。
波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序。
例如(2+3)4的逆波兰表达法为 + 2 3 4。
本题求解逆波兰表达式的值, 其中运算符包括+、-、*、/四个.
输入格式: 1行, 其中运算符和运算数之间都用空格分隔, 运算数是浮点数。
输出格式: 1行, 表达式的值. 可直接用printf(“%f\n”,v)输出表达式的值v。
提示: 可使用atof(str)把字符串转换为一个double类型的浮点数. atof定义在math.h中。
输入样例 | 输出样例 |
---|---|
* + 11.0 12.0 + 24.0 35.0 | 1357.000000 |
+ 1 + 2 + 3 + 4 5 | 15.000000 |
+ + + 1 2 + 3 4 + 5 6 | 21.000000 |
分析
- 不断从左到右扫描表达式,如果连续遇到两个操作数,则与前一个操作符进行计算,并将计算结果作为操作数代替。
- 从右向左扫描表达式,用栈存储遇到的操作数,若遇到操作符,则从栈中拿出两个数进行计算,再将计算结果压入栈中,扫描结束后,栈顶元素即为结果。
- 波兰表达式具有递归性质,一个波兰表达式本身就是由一个或多个波兰表达式组成。
#include <bits/stdc++.h>
using namespace std;
double exp()
{
char s[20];
cin >> s;
switch(s[0])
{
case '+': return exp() + exp();
case '-': return exp() - exp();
case '*': return exp() * exp();
case '/': return exp() / exp();
default : return atof(s);
}
}
int main()
{
printf("%0.6f",exp());
return 0;
}