224. 基本计算器 - leetcode刷题(C++)

一、题目

224. 基本计算器

二、分析

用栈来记录符号数。首先初始化为正数,即栈中放入一个1,代表正数。不用记录数值,类似于如下分解:

-(3-(4+5))
从左开始遍历,- 号,则符号数为 -1; 栈中栈顶符号数的相反数
遇到左括号,将符号数入栈,表示一个括号内数值计算结果的正负。
遇到 3,使用符号数 -1 进行计算,res = -1 * 3 = -3;
遇到 - 号,则符号数等于 1;栈中栈顶符号数的相反数
遇到左括号,符号数等于 1,入栈,
遇到 4,使用栈顶符号数 1 进行计算,res= -3 + 1*4 = 1;
遇到 + 号,符号数不变,
遇到 5,使用栈顶符号数 1 进行计算,res= 1 + 1*5 = 6;
遇到右括号,说明最新的符号数即将失效,即栈顶符号数出栈。
遇到右括号,同上一步。

所以可以看到,全程有一个 res 和符号数 sign 来记录结果和当前步骤的符号数。

三、代码

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;
        long num = 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
           {
                num = 0;
                while (i < n && s[i] >= '0' && s[i] <= '9')
                {
                    num = num * 10 + s[i] - '0';
                    i++;
                }
                ret += sign * num;
            }
        }
        return ret;
    }
};

执行用时:16 ms, 在所有 C++ 提交中击败了58.33%的用户
内存消耗:7.9 MB, 在所有 C++ 提交中击败了81.94%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值