欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

简化LeetCode 224题的基本计算器表达式

最编程 2024-02-03 18:55:56
...
  • 1 <= s.length <= 3 * 105
  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator

思路解析

这道题仅包含 +- 两种运算符,不需要考虑运算符优先级的问题。
加入给定一个仅包含 +-,不含括号的式子,那么求解将变得十分简单,而加上括号之后,我们需要考虑的是,一个数字在整个式子里应该是被加上还是被减去?(即这个数字的真正符号是?)
对任意一个数字,我们假设该数字外面有 n 层括号包裹,那么这个数字的正负性应当这样考虑:记录每层括号前的一个运算符,以及该数字前的运算符,通过负负得正,判断该数字的真正符号。
继续思考,发现 + 并不改变一个数字的正负性,我们需要记录该数字的每层括号前的符号中,有几个 -

用一个栈记录每一层括号前的符号,代码如下:

代码实现

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

        int ans = 0;
        int i = 0;
        int sign = 1;
        while(i < s.length()) {
            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 (i < s.length() && s[i] >= '0' && s[i] <= '9') {
                    num = num * 10 + s[i] - '0';
                    i++;
                }
                ans += sign * num;
            }
        }

        return ans;
    }
};

原文地址:https://www.cnblogs.com/xqmeng/p/14510607.html