【LeetCode-224】基本计算器

问题

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

  • 1 <= s.length <= 3 * 105
  • s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
  • s 表示一个有效的表达式

示例

输入: s = " 2-1 + 2 "
输出: 3

输入: s = "(1+(4+5+2)-3)+(6+8)"
输出: 23

解答:括号展开

class Solution {
public:
    int calculate(string s) {
        stack<int> stk;
        stk.push(1); // 默认表达式有一个大括号包着,括号前为正号
        int n = s.size(), res = 0, sign = 1; // sign初始化为1,相当于第一个数为正数时前面加一个正号
        for (int i = 0; i < n; i++) {
            if (s[i] == ' ') continue;
            switch (s[i]) {
                case '+': sign = stk.top(); break;
                case '-': sign = -stk.top(); break;
                case '(': stk.push(sign); break;
                case ')': sign = stk.top(); stk.pop(); break;
                default: {
                    int ans = 0;
                    while (i < n && isdigit(s[i]))
                        ans = ans * 10 - '0' + s[i++];
                    i--;
                    res += sign * ans;
                }
            }
        }
        return res;
    }
};

重点思路

由于本题操作符只有正负号,所以可以考虑直接将括号展开,通过一次遍历逐个数字相加。sign为当前数真正的正负号,栈stk存储括号前的正负号(括号前的正负号会影响当前真实正负号)。每次遇到右括号时,此时表明该括号结束,则出栈一个元素;反之,将当前真实正负号入栈。

posted @ 2021-03-10 11:03  tmpUser  阅读(49)  评论(0编辑  收藏  举报