leetcode.224:基本计算器

本文介绍了一种使用栈数据结构实现的基本计算器算法,用于解析并计算包含加减运算和括号的数学表达式。通过巧妙地利用正负标志和临时结果变量,算法能正确处理不同优先级的运算。

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

字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。

示例 1:

输入: “1 + 1”
输出: 2
示例 2:

输入: " 2-1 + 2 "
输出: 3
示例 3:

输入: “(1+(4+5+2)-3)+(6+8)”
输出: 23
说明:

你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:
本题在细节上有多种不同的处理方式,但总体的思路是利用栈来处理优先级的问题,难点在于两处,一个是对字符串的输入进行处理,使得数字和操作符能够正确的被解析出来,第二个是要综合考虑各种情况,数字入栈时,不同的操作符入栈时的各种问题。
暂时先选用一种很取巧的方式,只需要使用一个栈,利用一个值为±1的变量来标识±号,同时利用res变量保存每一个优先级中的计算结果。步骤如下:

  1. 对于当前符号为数字,while遍历到不是数字的地方或者是字符串的末尾,将数字整体提取出来,在while循环结束的时候,即当前数字解析完毕之后,根据当前的sign符和res变量进行计算,更新res变量;
  2. 对于当前字符为符号‘+’或者’-’,更新相应的sign变量即可;
  3. 对于当前字符为符号‘(’,表示优先级进入一个新的阶段,保存当前已经计算的res已经对应的sign,将res与sign入栈,并重置res和sign;
  4. 对于当前字符为’)'表示当前优先级已经计算完毕,这时候将结果与前阶段保存的结果进行合并,即用当前计算的结果乘上sign再加上前一阶段保存在栈中的res,即可合并成功;
  5. 最后返回res即可。
    分析:此种方式可以保证,每一级括号的算式都会被计算为一个数字,因此最后的括回能够保证处理完所有级别数字的合并。
class Solution {
public:
    int calculate(string s) {
        stack<int> nums;
        int len = s.size();
        int res = 0;
        int sign = 1;
        for(int i = 0; i<len ;i++)
        {
            int num = 0;
            if(s[i]>='0')
            {
                while(i<len&&s[i]>='0')
                {
                    num = num*10 + (s[i]-'0');
                    i++;
                }
                res += num*sign;
                i--;
            }else if(s[i]=='+')sign = 1;
            else if(s[i]=='-')sign = -1;
            else if(s[i]=='(')
            {
                nums.push(res);
                nums.push(sign);
                res = 0;
                sign = 1;
            }else if(s[i]==')')
            {
                res = res * nums.top();nums.pop();
                res = res + nums.top();nums.pop();
            }
        }
        return res;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值