【C++】35行递归+求和栈

表达式求值

http://www.nowcoder.com/questionTerminal/c215ba61c8b1443b996351df929dc4d4

class Solution {
public:
    int solve(string s) {
        int res = 0; //用于返回当前字符串的计算结果
        stack<int> sum; //用于求和
        char sign = '+'; //记录前一个符号,初始化为+,因为可以看成当前字符串前先加0
        int num = 0; //用于将连续数字字符串转化成数字或者记录递归结果
        for(int i = 0; i < s.size(); i++) { //遍历每一个字符
            if(s[i] >= '0' && s[i] <= '9') //先处理数字字符
                num = 10 * num + s[i] - '0'; //进位后加个位数
            if(s[i] == '(') { //对于括号
                int left = i++, count = 1; //用left记录最左括号位置,count记录左括号数,i当成右指针右移一格
                while(count > 0) { //最终目的是找到与最左括号匹配的右括号,类似于栈操作
                    if(s[i] == '(') count++;
                    else if(s[i] == ')') count--;
                    i++;
                }
                num = solve(s.substr(left + 1, i - left - 2)); //迭代计算括号内数值,注意不要包含最左最右括号,不然会死循环
                i--; //此时i是最右括号下一位,需要左移一位防止最右括号在字符串尾时发生越界从而使下面的判定失效
            }
            if(i == s.size() - 1 || s[i] == '+' || s[i] == '-' || s[i] == '*') { //对于字符串尾,或者加减乘,此时我们用的符号是上一次的,结算当前数字
                if(sign == '+') sum.push(num); //加法入栈
                else if(sign == '-') sum.push(-num); //减法相当于加负数
                else if(sign == '*') sum.top() *= num; //乘法与栈顶相乘
                sign = s[i]; //更新符号,若为末尾的右括号也无妨,因为马上就退出循环了
                num = 0; //重置当前数
            }
        }
        while(!sum.empty()) { //将栈内所有数字相加
            res += sum.top();
            sum.pop();
        }
        return res; //返回当前字符串计算结果
    }
};
全部评论
第18行感觉有些问题呢,虽然最后case可以通过,但是不够严谨。num = solve(s.substr(left + 1, i - left - 1)); 应该是num = solve(s.substr(left + 1, i - left - 2))才对。 比方说(1+2),这时i=5(右括号的下面一个位置),left=0(左括号位置)。那么substr长度应该是i-left-2。至于为什么-1的case能够通过,因为for循环中没有对')'进行讨论,直接跳过,不予以处理。 从程序运行角度讲答主可以正确运行,但是从逻辑上面讲还是需要修改哦。
3
送花
回复
分享
发布于 2021-03-27 14:11
思路很清晰!感激!
点赞
送花
回复
分享
发布于 2021-03-27 13:43
秋招专场
校招火热招聘中
官网直投
这个是真的清楚,力扣的把我绕晕了
点赞
送花
回复
分享
发布于 2021-06-01 23:05
好题解!
点赞
送花
回复
分享
发布于 2022-01-27 10:01
牛啊,思路清晰简单,
点赞
送花
回复
分享
发布于 2023-04-18 09:01 四川

相关推荐

点赞 评论 收藏
转发
61 16 评论
分享
牛客网
牛客企业服务