题目:基本计算器 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}
来源:语雀原笔记