题解 | #表达式求值#

表达式求值

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

#include <cctype>
#include <functional>
#include <queue>
#include <stack>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        queue<char> q;
        for (auto &c: s) {
            q.push(c);
        }
        function<int()> recur = [&]() -> int {
            stack<int> st;
            char bef = '+';
            int num = 0;
            while (!q.empty()) {
                auto now = q.front();
                q.pop();
                if (isdigit(now)) {
                    num = num * 10 + (now - '0');
                }
                if (now == '(') {
                    num = recur();
                }
                if (!isdigit(now) || q.empty()) {
                    switch (bef) {
                        case '+': {
                            st.push(num);
                        } break;
                        case '-': {
                            st.push(-num);
                        } break;
                        case '*': {
                            st.top() *= num;
                        } break;
                    }
                    num = 0;
                    bef = now;
                }
                if (now == ')') {
                    break;
                }
            }
            int res = 0;
            while (!st.empty()) {
                res += st.top();
                st.pop();
            }
            return res;
        };
        return recur();
    }
};

思路:递归。

* 遇到左括号进入递归。

* 遇到右括号退出递归,返回值即为括号里的表达式值。

* 把加减当作正负数存在栈中,结束时一起运算。

* 乘法优先级高,所以遇到乘法时需要马上取出栈顶的数计算。

全部评论

相关推荐

zhch7:建议9✌️把学历加黑加粗,如果实在offer可能是觉得佬不会去
投了多少份简历才上岸
点赞 评论 收藏
分享
06-13 10:15
门头沟学院 Java
想去夏威夷的大西瓜在...:我也是27届,但是我现在研一下了啥项目都没有呀咋办,哎,简历不知道咋写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务