【题目大意】
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入:
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出:
输出为一行,表达式的值。
可直接用printf(“%f\n”, v)输出表达式的值v。
例如:
输入 | 结果 |
---|---|
* + 11.0 12.0 + 24.0 35.0 | 1357.000000 |
【解题思路】
该题需要根据输入的运算符进行多次运算,用递归求解是一种可行并且简便的方法。设计函数时首先要定义一个字符数组存入输入的数据,再进行判断。如果第一个字符是运算符,就把后两个字符按照这个运算符进行计算。如果第二个还是运算符则继续向下判断并计算下两个字符。如果判断到数字则用atof()函数将str类型数据转化为double类型数据。这样大致的递归框架就完成了:
double result() //定义一个double类型的函数
{
if(a[0] == '+') //进行运算符的判断
{
return result() + result(); //返回相应运算符所表示的运算
}
else if(a[0] == '-')
{
return result() - result();
}
else if(a[0] == '*')
{
return result() * result();
}
else if(a[0] == '/')
{
return result() / result();
}
else
{
return atof(a); //如果是数字就转化为double类型
}
}
对于测试数据:* + 11.0 12.0 + 24.0 35.0
解释为:(11.0 + 12.0)* (24.0 + 35.0)
【参考代码】
#include <bits/stdc++.h>
#define M 1000000
using namespace std;
char a[M];
double result()
{
scanf("%s", a);
if(a[0] == '+')
{
return result() + result();
}
else if(a[0] == '-')
{
return result