题解 | #表达式求值#

表达式求值

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

全部评论

相关推荐

01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
KPLACE:首先是板面看起来不够,有很多奖,比我厉害。项目要精减,大概详细描述两到三个,要把技术栈写清楚,分点,什么算法,什么外设,怎么优化,不要写一大堆,分点,你写上去的目的,一是让别人知道你做了这个知识点,然后在面试官技术面的时侯,他知道你会这个,那么就会跟你深挖这个,然后就是个人评价改为专业技能
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务