字符串表达式加减乘法求值

Posted vector6_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串表达式加减乘法求值相关的知识,希望对你有一定的参考价值。

字符串表达式加减乘法求值

请写一个整数计算器,对于输入的字符串,支持加减乘三种运算和括号。

示例1:

“1+2”

3

示例2:

“(2*(3-4))*5”

-10

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        int res = 0;
        stack<int> sumStack;
        char sign = '+';                                   //保存上一次的运算符
        int num = 0;                                       //数字
        for(int i=0; i<s.length(); ++i)
        {
            if(s[i] >= '0' && s[i]<='9')
            {
                num = num * 10 + s[i]-'0';
            }
            if(s[i] == '(')                                //对于括号,先找到对应的右括号,然后递归
            {
                int left = i++, count = 1;                 //left记录最左括号位置,count记录左括号数
                while(count>0)
                {
                    if(s[i] == '(')
                        count++;
                    else if(s[i] == ')')
                        count--;
                    ++i;
                }
                num = solve(s.substr(left+1, i-left-2));   //递归,注意坐标,不要包含最左最右括号
                --i;                                       //此时i是最右括号的下一位,需要左移一位,防止下面的判断越界
            }
            if(i==s.length()-1 || s[i]=='+' || s[i]=='-' || s[i]=='*')
            {
                if(sign == '+')                            //注意根据上一次的计算符判断本次的操作
                    sumStack.push(num);                    //加减法直接入栈,乘法与栈顶相乘
                else if(sign == '-')
                    sumStack.push(-num);
                else if(sign =='*')
                    sumStack.top()*=num;
                sign = s[i];
                num = 0;
            }
        }
        while(!sumStack.empty())                            //最后将栈内所有数字相加
        {
            res+=sumStack.top();
            sumStack.pop();
        }
        return res;
    }
};

以上是关于字符串表达式加减乘法求值的主要内容,如果未能解决你的问题,请参考以下文章

栈的典型应用-表达式求值

洛谷 P1981 表达式求值

刷过一题之NOIP2013表达式求值

C语言编程-逆波兰表达式求值

表达式求值(NOIP2013 普及组第二题)

1033. 表达式求值