大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的主要知识点包括字符串处理、栈的使用、递归、以及基本的算术运算。

题目解答方法的文字分析

我们需要实现一个基本的计算器,支持加法、减法、乘法和括号运算。在这个优化版本的代码中,我们使用一个单栈来同时存放数字和运算符,以避免维护两个栈的复杂性。思路步骤与之前相似。

  1. 遍历字符串s的每个字符:如果当前字符是数字,则将其添加到num中。如果当前字符是左括号(,我们需要找到与之匹配的右括号),然后递归计算括号内的表达式。如果当前字符不是空格,或者已经到达字符串末尾: 根据op的值,将当前数字根据正负号添加到栈st中,如果是乘法运算,则将栈顶数字与当前数字相乘并重新压栈。重置num为0,更新op为当前字符。
  2. 最后,遍历栈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;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!