【打卡】牛客网:BM49 表达式求值(调试很久)

资料:

1. vector的字符串中,size()和length()是一样的。length()只是用来获取字符串的长度。

length()、size()、sizeof()三者的区别_vector用size还是length_我是一只蘑菇17的博客-CSDN博客

2. swicth-case里,定义新的变量的方法:

在case后加上作用域符号{}即可解决。

switch-case内不能定义变量?-CSDN博客  

模板的:

  • 遍历一遍,变成所有数求和。最后求和。
  • +号后面的数,直接放
  • -号后面的数,取相反数放
  • *号则将当前数和最后放进去的数相乘,再放
  • 遇到(),递归。
  • #include <cctype>
    class Solution {
      public:
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 返回表达式的值
         * @param s string字符串 待计算的表达式
         * @return int整型
         */
        // 返回vector<int> 而不是int
        vector<int> fun(string s, int start) {
            char temp_op = '+';
            int temp_num = 0;
            stack<int> res; //存储最后的、用来求和的结果
    
            int i = start;
            for (; i < s.size(); i++) {
                //1.预处理操作(处理数字、处理带括号的递归)
                //如果当前s[i]是数字
                if (isdigit(s[i])) {
                    temp_num = temp_num * 10 + s[i] - '0';
                    if (i != s.size() - 1)
                        //如果后面还有东西,continue,不能进行下面的操作
                        //如果没有这个if-continue语句,那么temp_num会在后面被“归零”
                        continue;  //粗心,写成break了
                }
                //如果当前s[i]是'('
                if (s[i] == '(') {
                    vector<int> kuohao = fun(s, i + 1);
                    // 不需要push,因为'('前已经push了,此时temp_num是归零状态
                    // res.push(kuohao[0]);
                    temp_num = kuohao[0]; //粗心忘了
                    i = kuohao[1];
                    if (i != s.size() - 1)
                        continue;
                }
    
                //2.处理当前的操作(把数字放入最终的列表)
                //如果当前s[i]是其他操作符,根据temp_op,把temp_num放入res
                switch (temp_op) {
                    case '+':
                        res.push(temp_num);
                        break;
                    case '-':
                        res.push(-temp_num);
                        break;
                    case '*': 
                        temp_num *= res.top();
                        res.pop();
                        res.push(temp_num);
                        break;
                }
    
                // 3. 归零系列操作
                // 相当于全局变量,所以在push了temp_num后,下一次for循环前,要“归零”
                temp_num = 0;
    
                if (s[i] == ')')
                    break; // break需要中断整个for循环,直接结束,所以放在switch外面。
                else
                    temp_op = s[i];
            }
    
            // 最后,求和
            int res_total = 0;
            int res_size = res.size();
            // 注意,不能for循环里面用size,因为res在每个循环后的size是变化的。for (int j = 0; j < res.size(); j++) {
            for (int j = 0; j < res_size; j++) {
                res_total += res.top();
                res.pop();
            }
            return vector<int> {res_total, i};
        }
        int solve(string s) {
            // write code here
            return fun(s, 0)[0];
        }
    };

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值