题目:基本计算器 II

https://leetcode.cn/problems/basic-calculator-ii/solutions/648647/ji-ben-ji-suan-qi-ii-by-leetcode-solutio-cm28/

 1int calculate(string s)
 2{
 3    // 对于字符串中的第一个数字默认符号是'+'
 4    char preSign = '+';
 5    // 维护一个栈用于存储数字
 6    std::vector<int> st;
 7    int num = 0, n = s.length();
 8
 9    for(int i = 0 ; i < n; i++)
10    {
11        // 如果是数字,就进行累加
12        if(isdigit(s[i]))
13        {
14            num = num * 10 + (s[i] - '0');
15        }
16        // 如果不是数字,同时也不是空格
17        if(!isdigit(s[i]) && s[i] != ' ' || i == n - 1)
18        {
19            // 根据符号对之前累加得到的 num 进行处理
20            switch(preSign)
21            {
22                case '+' :
23                    st.push_back(num);
24                    break;
25                // 如果是减号,就将负数形式保存进栈中
26                case '-' :
27                    st.push_back(-num);
28                    break;
29                // 如果是乘除,就直接对栈顶的数字与当前保存的 num 进行对应运算
30                case '*' :
31                    st.back() *= num;
32                    break;
33                default :
34                    st.back() /= num;
35            }
36            // 将 num 置为零,不用存入栈中,因为已经与栈顶元素进行过处理了
37            num = 0;
38            // 把当前符号传递给下一个数字使用
39            preSign = s[i];
40        }
41    }
42    // 最后栈里只剩下被处理过正负号的数字,全部加起来就是结果
43    return accumulate(st.begin(), st.end(), 0);
44}

来源:语雀原笔记