ration (3) in 函数 int in(char c){ // 判断是否为运算符,是运算符返回 1 ;否则返回 0 if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') return 1; else return 0; }//in 四、调试分析 4.1 难点以及困难 1. 由于本次试验做过堆栈式计算器,思维存在惯性,打不开新思路; 2. 建立二叉链表是最重要的环节, 而在这之前, 必须先得到后缀表达式, 由于之前没有接触过后缀表达式, 从而给变成造成了困难。即涉及 char 型和 float 型变量统一化,又有算符优先级的判别。 3. 二叉链表的建立, 要利用好优先级, 以及注意操作数为叶子节点这一特点。 4.2 经验与体会 1. 算式计算的问题是一个非常经典的题目。之前用栈来实现的。但是用栈来实现是一个非常麻烦的过程, 第一要解决算式判断, 是否为符合规则的算式, 第二要由中缀表达式转化为后缀表达式。这两个部分是栈实现计算算式表达式的比较复杂的地方。不仅如此, 栈实现里面的各种运算符的优先级, 各种条件判断, 可以说是麻烦的要命。相比之下,用二叉树免除了算式表达式的检查过程。并不是不需要检查, 而是检查的过程就包含在创建二叉树的过程。认真分析, 我们会发现, 所有的叶子结点必须是操作数结点, 而所有的非叶子结点必须是运算符结点, 否则表达式的结构一点不正确, 创建二叉树的过程就可以对表达式经行检查。 2. 总结一句就是: 好的数据结构能事半功倍, 要培养善于发现的思维, 当有某个思路然后去实现它,另外要积累经验。好好理解数据结构! 五、测试结果 1. 加减运算输入: 6+9-5 输出: 10 2. 乘除运算输入: 5.6*2.7/2 输出: 7.56 3. 四则混合运算输入: (2+3)*8-3/2 输出: 23.5