题解 | #表达式求值#

表达式求值

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

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */

    // 从s1中取两个值,从vv中取一个操作符 来运算
    void fun(stack<int>& s1, vector<char>& vv, int& top)
    {
        int right = s1.top();
        s1.pop();
        int left = s1.top();
        s1.pop();
        if (vv[top] == '+')
            s1.push(left + right);
        else if (vv[top] == '-')
            s1.push(left - right);
        else
            s1.push(left * right);
        top--; // 删除使用了的操作符
    }

    int solve(string s) {
        // write code here
        int size = s.size();
        stack<int> s1; // 数字的栈
        vector<char> vv(size); // 操作符的栈
        int top = -1;
        for (int i = 0;i<size;i++) {
            if (s[i] == '(') // 直接插入即可
                vv[++top] =s[i] ;
            else if (s[i] == '*') { // ‘(’之前的‘*’全部输出
                while (top != -1) {
                    if (vv[top] == '*') {
                        fun(s1, vv, top);
                    }
                    else
                        break;
                }
                vv[++top] = s[i];
            }
            else if (s[i] == '+' || s[i] == '-') {
                // 把‘(’之前的操作符全部输出
                while (top != -1) {
                    if (vv[top]!='(') {
                        fun(s1, vv, top);
                    }
                    else
                        break;
                }
                vv[++top] = s[i];
            }
            else if (s[i] == ')')
            {
                // 把左括号之前的全部出栈
                while (top != -1)
                {
                    if (vv[top] != '(')
                    {
                        fun(s1, vv, top);
                    }
                    else
                    {
                        top--;
                        break;
                    }
                }
            }
            else // 插入数字栈中
            {
                // 可能有多位数
                int num = s[i]-'0';
                while (i + 1 < size && s[i + 1] >= '0' && s[i + 1] <= '9')
                {
                    num = num * 10 + s[i + 1] - '0';
                    i++;
                }
                s1.push(num);
            }
        }
        fun(s1, vv, top);
        return s1.top();
    }
};

首先要了解中缀表达式的求解过程。

需要两个栈,一个存操作数,用stl中的stack来实现,一个存操作符,用vector<char>来实现,方便读取数据。

然后依次遍历,如果遇到操作数,则压入s1中,遇到操作符,则需要考虑。

如果此操作符为'*'号,则输出左括号之前的全部为'*'号的操作符,这里直接调用fun函数即可。

如果为'+' || '-' ,则需要将左括号之前的操作符全部输出。

如果为')' 则需要将'('之前的操作符输出,并且最终将'('也输出。

如果为'(',则直接压入栈中即可。

最后注意字符串的数字可能不是一位的,所以在插入数字时需要看一看后一位是否也是数字。

#牛客创作赏金赛#
牛客网刷题记录 文章被收录于专栏

本人认为值得记录的一些题

全部评论

相关推荐

被加薪的哈里很优秀:应该继续招人,不会给你留岗位的
点赞 评论 收藏
分享
Yki_:以下条件优先录用: 喜欢去缅北当猪仔的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务