题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    char c;
    int pos = 0;
    stack<char> C;
    stack<int> I;
    bool getc(string s) {
        if (pos < s.size()) {
            c = s[pos++];
            return 1;
        } else
            return 0;
    }
    void cal() {
        char op = C.top();
        C.pop();
        int n2 = I.top();
        I.pop();
        int n1 = I.top();
        I.pop();
        int val;
        switch (op) {
            case '+':
                val = n1 + n2;
                break;
            case '-':
                val = n1 - n2;
                break;
            case '*':
                val = n1 * n2;
                break;
            case '/':
                val = n1 / n2;
                break;
        }
        I.push(val);
    }
    void E(string s) {
        T(s);
        while (c == '+' || c == '-') {
            C.push(c);
            getc(s);
            T(s);
            cal();
        }
        return;
    }
    void T(string s) {  //
        F(s);
        while (c == '*' || c == '/') {
            C.push(c);
            getc(s);
            F(s);
            cal();
        }
        return;
    }
    void F(string s) {
        if (c == '(') {
            getc(s);
            E(s);
            getc(s);
            return;
        }
        //此处必然是数字
        int val = 0;
        while (c >= '0' && c <= '9') {
            val = val * 10 + (c - '0');
            if (!getc(s))
                break;
        }
        I.push(val);
    }
    int solve(string s) {
        // write code here
        if (!getc(s))
            return 0;
        E(s);
        return I.top();
    }
};

编译技术中自顶向下递归子程序法来解,懂得编译原理的牛牛们一定不陌生。

由于不需要考虑语法错误,逻辑性上就可以简化部分。

虽然调用的函数块过多,但逻辑是极为清晰的。

函数分为solve、E(多项式)、T(加减数)、F(因子)

E函数用于处理各个项之间的加减运算,

T用来处理乘除法,

F用来处理具体因子或者括号。

全部评论

相关推荐

投递美团等公司6个岗位
点赞 评论 收藏
分享
抱抱碍事梨a:三点建议,第一点是建议再做一个项目,把自我介绍部分顶了,第二点是中南大学加黑加粗,第三点是建议加v详细交流
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务