当前位置:   article > 正文

力扣 224.基本计算器--C++_力扣 计算器4

力扣 计算器4

题目:

实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。

代码:

class Solution {
public:
    int calculate(string s) {
        stack<int> ops;
        ops.push(1);
        int sign = 1;

        int ret = 0;
        int n = s.length();
        int i = 0;
        while (i < n) {
            if (s[i] == ' ') {
                i++;
            } else if (s[i] == '+') {
                sign = ops.top();
                i++;
            } else if (s[i] == '-') {
                sign = -ops.top();
                i++;
            } else if (s[i] == '(') {
                ops.push(sign);
                i++;
            } else if (s[i] == ')') {
                ops.pop();
                i++;
            } else {
                long num = 0;
                while (s[i] >= '0' && s[i] <= '9') {
                    num = num * 10 + s[i] - '0';
                    i++;
                }
                ret += sign * num;
            }
        }
        return ret;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

理解:

因为有括号所以导致运算时有先后顺序,此时需要保存之前的运算结果再运算后面的,所以需要用到栈结构
该方法将栈顶存的是运算符,在 pop 的时候弹出的是需要先算的,也就是括号里面的.用到了递归的思想

while (s[i] >= '0' && s[i] <= '9') {
                    num = num * 10 + s[i] - '0';
                    i++;
                }
  • 1
  • 2
  • 3
  • 4

这段代码是为了运算多位数时循环逐位读取,好比将字符 ‘290’转成数字290,先解析2,再解析9时,将210+9=29;再解析0时,将2910+0=290;这样,就完成了字符’290‘到数字290的转变.

- '0'
  • 1

是因为该题目是字符串形式的,在字符串与整形运算时是用ASCII 码的数值运算的,所以要减掉’0’代表的 ASCII 码 48 才是真正的整型数字

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/848175
推荐阅读
相关标签
  

闽ICP备14008679号