大家好,我是开车的阿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;
}
};

京公网安备 11010502036488号