1. 程式人生 > 其它 >力扣224. 基本計算器

力扣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);    //計算出的數再進棧
    }
};