每日一题:基本计算器(LeetCode 224)

题目

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
示例 1
- 输入:s = "1 + 1"
- 输出:2
示例 2
- 输入:s = " 2-1 + 2 "
- 输出:3
示例 3:
- 输入::s = "(1+(4+5+2)-3)+(6+8)"
- 输出:23
提示:
- 1 <= s.length <= 3 * 105
- s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
- s 表示一个有效的表达式

解答

class Solution {
public:
    int calculate(string s) {
        //记录表达式的计算结果
        int nRes = 0;
        //记录运算符号,'+'为1,'-'为-1
        int nSigned = 1;
        //记录当前数字的值
        int nVal = 0;
        stack<int> stk;
        for(int  i = 0; i < s.size(); i++)
        {
            int num = s[i] - '0';
            if(s[i] >= '0' && s[i] <= '9')
            {
                //是数字则累加
                nVal = nVal*10 + num;
            }
            else if(s[i] == '+')
            {
                //计算+之前的表达式结果
                nRes = nRes + nSigned*nVal;
                //重置val为0
                nVal = 0;
                nSigned = 1;
            }
            else if(s[i] == '-')
            {
                //计算-之前的表达式结果
                nRes = nRes + nSigned*nVal;
                //重置val为0
                nVal = 0;
                nSigned = -1;
            }
            else if(s[i] == '(')
            {
                //遇见左括号将之前的计算结果与符号入栈
                stk.push(nRes);
                stk.push(nSigned);
                nRes = 0;
                nSigned = 1;
            }
            else if(s[i] == ')')
            {
                //遇见又括号,则先计算括号内值
                nVal  = nRes + nSigned*nVal;
                //取出()前的符号
                nSigned = stk.top();
                stk.pop();
                //取出进入括号前的运算结果
                nRes = stk.top();
                stk.pop();
            }
        }
        //遍历结束,计算结果
        nRes = nRes + nSigned*nVal;
        return nRes;
    }
};
扫描关注程序区

有任何问题,请联系邮箱:support@progdomain.com

THE END
分享
二维码
打赏
海报
每日一题:基本计算器(LeetCode 224)
题目 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 示例 1: - 输入:s = "1 + 1" - 输出:2 示例 2: - 输入:s = " 2-1 + 2 " ……
<<上一篇
下一篇>>