题解 | #表达式求值#

表达式求值

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用来处理具体因子或者括号。

全部评论

相关推荐

02-18 17:30
腾讯_TEG_技术
多刷**&nbsp;背八股&nbsp;刷面经&nbsp;项目话术准备好&nbsp;不会差的!!!后台看到好多小伙伴们都出现其中一个环节的错误,,,可惜了抓紧机会吧&nbsp;有的是hc&nbsp;但缺的就是稍微用心的人
野猪不是猪🐗:多刷星星,背八股背话术,真的能过你们?对一个个没实习过的学生狂问场景题设计题和底层深挖,别以为我不知道一边说缺人还一边各种kpi面
点赞 评论 收藏
分享
nbdy:字太多了,写简历不是写自传,亮点难点技能点列出来就行,要简明扼要
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务