题解 | #表达式求值#

表达式求值

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

#include <cctype>
class Solution
{
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    // 计算函数
    int caculate(int a, int b, char op)
    {
        switch (op)
        {
        case '+':
            return a + b;
        case '-':
            return a - b;
        case '*':
            return a * b;
        default:
            return 0;
        }
    }

    // 优先级函数
    int precedence(char op)
    {
        switch (op)
        {
        case '+':
        case '-':
            return 1;
        case '*':
            return 2;
        default:
            return 0;
        }
    }

    int solve(string s)
    {
        // 双栈
        stack<char> op;
        stack<int> num;

        for (int i = 0; i < s.length(); ++i)
        {
            // 防空格
            if (isspace(s[i]))
                continue;
            // 进入数字识别状态,isdigit(s[i]) = s[i] >= '0' && s[i] <= '9'
            if (isdigit(s[i]))
            {
                int flag = i;
                int n = 0;
                while (isdigit(s[flag]))
                {
                    n = n * 10 + (s[flag] - '0');
                    flag++;
                }

                i = flag - 1;
                num.push(n);
            }

            else if (s[i] == '(')
            {
                op.push(s[i]);
            }

            // 碰到右括号触发计算
            else if (s[i] == ')')
            {
                while (!op.empty() && op.top() != '(')
                {
                    int b = num.top();
                    num.pop();
                    int a = num.top();
                    num.pop();
                    char opt = op.top();
                    op.pop();

                    num.push(caculate(a, b, opt));
                }
                op.pop(); // 弹出左括号
            }

            // 其他符号
            else
            {
                // 如果栈顶的优先级大于现在符号,则需要弹栈,并进行计算
                while (!op.empty() && precedence(op.top()) >= precedence(s[i]))
                {
                    int b = num.top();
                    num.pop();
                    int a = num.top();
                    num.pop();
                    char opt = op.top();
                    op.pop();

                    num.push(caculate(a, b, opt));
                }
                op.push(s[i]);
            }
        }

        // 处理剩下的部分
        while (!op.empty())
        {
            int b = num.top();
            num.pop();
            int a = num.top();
            num.pop();
            char opt = op.top();
            op.pop();

            num.push(caculate(a, b, opt));
        }

        return num.top();
    }
};

双栈做法,个人感觉比较好理解

全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
头像
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务