逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰 表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如 (2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符 包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点 数
输出 输出为一行,表达式的值。
样例输入 * + 11.0 12.0 + 24.0 35.0
样例输出 1357.000000
提示:(11.0+12.0)*(24.0+35.0)
声明:
本题中的逆波兰表达式实际上是波兰表达式
其定义:
(1):一个数是逆波兰表达式,值为该数
(2): "运算符 逆波兰表达式 逆波兰表达式"是逆波兰表达式,值为逆波兰表达式的值运算结果
代码说明:
每次调用exp函数的时候,读入一个逆波兰表达式,此时不会调用其它的case语句,所以也就不用写break,然后在一个case中递归调用exp,再次读入一个子逆波兰表达式,一直到子逆波兰表达式的值为两个数的时候,递归结束,整个函数的值返回。
像是例题中的表达式,就要向 * 号的递归中返回两次,因为调用了两次exp函数。
对于cin的理解,对于cin来说,结束标志位空格、Tap和enter,所以每次从数据缓冲区读入的时候,都会读入空格然后结束,因为本题中是输入空格的。
#include <iostream>
#include <cstdio>
#include <cstdlib>
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);
break;
}
}
int main()
{
printf("%lf
", exp());
getchar();
getchar();
return 0;
}