至今看到的最简版:
---------------------------------------------------------------------------------------------
#include<iostream>
#include<math.h>
using namespace std;
double exp()
{
char a[10];
scanf("%s",a);//注意scanf取入字符串遇到‘\0’停止
switch(a[0]){
case '+':return exp()+exp();
case '-':return exp()-exp();
case '*':return exp()*exp();
case '/':return exp()/exp();
default:return atof(a);
}
}
int main()
{
double ans;
ans=exp();
printf("%f",ans);
return 0;
}
------------------------------------------------------------------------------------------------
核心思想就是递归,计算7*8+9 即前缀表达式为 + * 7 8 9 的式子 程序执行过程如下图所示:
() + ()
| |
\ / \ /
( ) * ( ) return 9
| |
\ / \ /
return 7 return 8
【1】读进第一个字符串,发现是+号 递归调用
【2】递归读进第二个字符串,发现是*号 递归调用
【3】递归读进第三个字符串,发现是数字,返回数字
··········
实现中常见问题:
【1】直接读进整个式子 再作分析,容易出现逻辑混乱的情况。
【2】不会使用atof()函数,自己写字符串转换为浮点数的函数,容易出错,考虑不全面。