力扣224. 基本計算器
阿新 • • 發佈:2022-04-18
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); //計算出的數再進棧 } };