问题链接:CCF NOI1121 逆波兰表达式。
时间限制: 1000 ms 空间限制: 262144 KB
题目描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
数据范围限制
1<a<32768
提示
可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在stdlib.h中。
问题分析
这是一个计算问题。
逆波兰表达式通常用堆栈来处理,递归调用与堆栈具有同样的效果。
(略)
要点详解
- 用递归函数来处理逆波兰表达式。
参考链接:(略)。
100分通过的C语言程序:
#include <stdio.h>
#include <stdlib.h>
#define N 32
char a[N];
double calculate()
{
scanf("%s", a);
if(a[0] == '+')
return calculate() + calculate();
else if(a[0] == '-')
return calculate() - calculate();
else if(a[0] == '*')
return calculate() * calculate();
else if(a[0] == '/')
return calculate() / calculate();
else
return atof(a);
}
int main(void)
{
printf("%lf\n", calculate());
return 0;
}