题目链接:http://acm.nyist.net/JudgeOnline/status.php?pid=128
题目分析:
由于表达式都可以转换成树(这个都知道吧),所以表达式计算在某种意义上来说就是这个树的一种遍历而已,最经典的就是使用递归方法。这里由于输入是给定的字符串,所以需要从给定的字符串里面得到我们想要的,那sscanf函数就能提供这一点,其实用法跟scanf一样的,不过就是第一个参数要指定输入流。
这里需要说明为什么i是一个全局变量,一般来说写程序我不喜欢用全局变量。因为如果一个数据读过之后,就不能再第二次读。这里的i就是控制读入起点的。
#include<stdio.h>
int i;
char str[502];
double Calculate()
{
++i;
if(str[i] == '+')
return Calculate() + Calculate();
else if(str[i] == '-')
return Calculate() - Calculate();
else if(str[i] == '*')
return Calculate() * Calculate();
else if(str[i] == '/')
return Calculate() / Calculate();
else if(str[i] <= '9' && str[i] >= '0')
{
double num;
sscanf(&str[i], "%lf", &num);
while(str[i] != '\0' && str[i] != ' ')
++i;
return num;
}
else
return Calculate();
}
int main()
{
while(gets(str))
{
i = -1;
printf("%.2lf\n", Calculate());
}
return 0;
}