加载中...

力扣224. 基本计算器

224. 基本计算器

224. 基本计算器
难度:困难
描述:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:

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

示例 2:

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

示例 3:

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

代码
class Solution {
public:
        unordered_map<char,int>oper_pri={
            {'+',1},
            {'-',1},
            {'*',2},
            {'/',2}
        };   //确定操作符优先级
        stack<long long>nums;
        stack<char>oper;
    int calculate(string s) {
        int n=s.size();
        nums.push(0);   //防止为这样的式子-3+2
        for(int i=0;i<n;i++)
        {
            //从左向右遍历式子,可能为数字,操作符,空格,( ,或 )
            //情况一  为数字
            if(s[i]>= '0'&&s[i]<='9')
            {
                int t=i;
                while  (i+1<n&&s[i+1]>='0'&&s[i+1]<='9') //可能不是10以内的数,如27
                {
                    i++;
                }
                nums.push(stoll(s.substr(t,i-t+1)));
            }
            //情况二 为空格则直接跳过
            else if(s[i]==' ')
            {
                continue;
            }
            //情况三  为(  可能为(-3+7)则在-前加0变为(0-3+7)
            else if(s[i]=='(')
            {
                oper.push(s[i]);
                if(s[i+1]=='-'||s[i+1]=='+')
                {
                    nums.push(0);
                }
                else{
                    continue;
                }
            }
            //情况四  为)  
            else if(s[i]==')')
            {
                while(oper.top()!='(')
                {
                    operater();
                }
                oper.pop();
            }

            //情况五  为其他操作符时,要判断操作符优先级,进行出栈运算
            else {
                while(!oper.empty()&&oper.top()!='('&&oper_pri[oper.top()]>=oper_pri[s[i]])
                {
                    operater();
                }
                oper.push(s[i]);
            }
        }
        //整个式子遍历完后对nums和oper两个栈进行计算
        while(!oper.empty()&&oper.top()!='(')
        {
            operater();
        }
        return nums.top();
    }

    void operater(){
        long long a=nums.top();nums.pop();
        long long b=nums.top();nums.pop();
        char op=oper.top();oper.pop();
        long long ans;
        switch(op)
        {
            case '+':ans=b+a;break;
            case '-':ans=b-a;break;
            case '*':ans=b*a;break;
            case '/':ans=b/a;break;
        }
        nums.push(ans);    //计算出的数再进栈
    }
};
posted @ 2022-04-18 18:39  fengrrr  阅读(80)  评论(0)    收藏  举报