牛客题霸 [表达式求值] C++题解/答案

题目描述

请写一个整数计算器,支持加减乘三种运算和括号。

题解:

没有除法emmm
我们从头开始依次判断每个字符
如果是左括号,我们就找右括号,并截取括号内的数字
记录上一次的符号,然后将处理后的数字的数字压入栈中
使得栈内的所有元素都是相加的关系
最后将栈内元素全部相加
详细可以看看代码

代码:

class Solution {
   
public:
    /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */
    int solve(string s) {
   
        // write code here
        stack<int> st;
        int sum = 0, number = 0;
        char sign = '+';
        for(int i=0; i<s.size(); i++) 
        {
   
            char c = s[i];
            if(c >= '0' && c <= '9') 
            {
   
                number = number * 10 + c - '0';
            }
            if(c == '(') 
            {
   
                int j = i+1;
                int count = 1;
                while(count > 0) 
                {
   
                    if(s[j] == '(') count++;
                    else if(s[j] == ')') count--;
                    j++;
                }
                number = solve(s.substr(i+1, j-(i+1)));
                i = j-1;
            }
            if(c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '/' || i == s.size()-1) 
            {
   
                if(sign == '+') 
                {
   
                    st.push(number);
                } 
                else if(sign == '-') 
                {
   
                    st.push(-number);
                } 
                else if(sign == '*') 
                {
   
                    int t = st.top(); st.pop();
                    st.push(t*number);
                } 
                number = 0;
                sign = c;
            }
        }
        
        while(!st.empty()) 
        {
   
            sum += st.top();
            st.pop();
        }
        return sum;
    }
};