经典指数          
原因
2386
浏览数
1
收藏数
 

现有一四则运算表达式,仅包含+-*/()和0~9数字,请设计一个算法,计算该表达式的值。 其中+-只作为运算符出现,不作为正负符号出现在表达式中。  请完成calc的代码实现(C++或Java) 已有字符串和数字的转换方法(str2num, num2str)可直接调用,无须实现。  C++: float str2num(char[] str) {     … } char[] num2str(float num) {     … } float calc(char[] exp) {     … } Java: float str2num(String str) {     … } String num2str(float num) {     … } float calc(String exp) {     … } 例如:  输入“1+2*(3-4)”  输出-1

     举报   纠错  
该题目由题来君提供于 2015-10-08 16:59
 
切换
1 个答案

c++递归下降分析器的解法,语法规则:

expr   = term   [+- term]...

term   = factor [*/ factor]...

factor = number | (expr)

5块钱的代码,没有语法错误处理,零除检查,大数什么的:)

float expr(char* s, int& pos);

float term(char* s, int& pos);

float factor(char* s, int& pos);

float number(char* s, int& pos);

float expr(char* s, int& pos) {

        float v = term(s, pos);

        while (s[pos] == '+' || s[pos] == '-') {

                if (s[pos++] == '+')

                        v += term(s, pos);

                else

                        v -= term(s, pos);

        }

        return v;

}

float term(char* s, int& pos) {

        float v = factor(s, pos);

        while (s[pos] == '*' || s[pos] == '/') {

                if (s[pos++] == '*')

                        v *= factor(s, pos);

                else

                        v /= factor(s, pos);

        }

        return v;

}

float factor(char* s, int& pos) {

        if (s[pos] == '(') {

                pos++;

                float v = expr(s, pos);

                pos++;

                return v;

        } else {

                return number(s, pos);

        }

}

float number(char* s, int& pos) {

        int n = 0;

        while (s[pos] >= '0' && s[pos] <= '9')

                n = n * 10 + s[pos++] - '0';

        return (float)n;

}

float calc(char[] exp) {

        int pos = 0;

        return expr(exp, pos);

}

举报   题来君 · 2015-12-29 23:29
 
切换
撰写答案