大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的主要知识点包括字符串处理、栈的使用、递归、以及基本的算术运算。
题目解答方法的文字分析
我们需要实现一个基本的计算器,支持加法、减法、乘法和括号运算。在这个优化版本的代码中,我们使用一个单栈来同时存放数字和运算符,以避免维护两个栈的复杂性。思路步骤与之前相似。
- 遍历字符串s的每个字符:如果当前字符是数字,则将其添加到num中。如果当前字符是左括号(,我们需要找到与之匹配的右括号),然后递归计算括号内的表达式。如果当前字符不是空格,或者已经到达字符串末尾: 根据op的值,将当前数字根据正负号添加到栈st中,如果是乘法运算,则将栈顶数字与当前数字相乘并重新压栈。重置num为0,更新op为当前字符。
- 最后,遍历栈st内的数字,累加得到最终的结果。
本题解析所用的编程语言
本题解析所用的编程语言是C++。
完整且正确的编程代码
class Solution { public: int calculate(string s) { stack<int> st; // 用于存放数字和运算结果 int num = 0; // 临时存放数字 char op = '+'; // 上一个运算符,默认为加号 int result = 0; // 存放最终结果 for (int i = 0; i < s.size(); ++i) { char c = s[i]; if (isdigit(c)) { num = num * 10 + c - '0'; // 构建数字 } else if (c == '(') { int j = i, cnt = 0; // 找到与当前左括号匹配的右括号的位置 for (; i < s.size(); ++i) { if (s[i] == '(') ++cnt; if (s[i] == ')') --cnt; if (cnt == 0) break; } num = calculate(s.substr(j + 1, i - j - 1)); // 递归计算括号内表达式 } if (!isspace(c) || i == s.size() - 1) { // 非空格字符或字符串末尾 if (op == '+') { st.push(num); } else if (op == '-') { st.push(-num); // 负号表示减法运算 } else if (op == '*') { int temp = st.top() * num; // 乘法运算 st.pop(); st.push(temp); } num = 0; // 重置临时数字 op = c; // 更新上一个运算符 } } while (!st.empty()) { result += st.top(); // 累加栈内的数字 st.pop(); } return result; } };