1. 程式人生 > 實用技巧 >leetcode 772 基本計算器III(包含+-*/ 以及括號) 核心在於遞迴

leetcode 772 基本計算器III(包含+-*/ 以及括號) 核心在於遞迴

現基本計算器以計算簡單表示式字串。

表示式字串可以包含左括號(和右括號)、加號+或減號、非負整數和空格。

表示式字串只包含非負整數、+、-、*、/運算子、左括號和空格。整數除法應該截斷為零。

您可以假定給定的表示式總是有效的。所有中間結果將在範圍內[-2147483648,2147483647]

"1 + 1" = 2
" 6-4 / 2 " = 4
"2*(5+5*2)/3+(6/2+8)" = 21
"(2+6* 3+5- (3*14/7+2)*5)+3"=-12

class Solution {
public:
    int FindClosing(string s,int i){
        
int level = 0,k=0; for(k=i;k<s.size()-1;k++){ if(s[k] == '(') level++; if(s[k] == ')') { if(--level == 0) return k; } } return k; } //帶括號的話,用遞迴,更難一些(找到對應層級的括號並同時刪除) int calculate(string s) { //利用棧: 3+5/2*3轉化為 +3 +5 /2 *3
stack<int> nums; int n = s.size(); int num = 0,res =0,pre=0; char sign = '+'; for(int i=0;i<n;){ //if(isspace(s[i])) continue; 忽略不用管空格 if(isdigit(s[i])){ num = num*10+(s[i]-'0'); } if(s[i] == '(
'){ //s的子串,找),剔除() int j = FindClosing(s,i); num = calculate(s.substr(i+1,j)); i+=j; } if(!isspace(s[i]) && !isdigit(s[i]) || i == n-1){ switch (sign){ case '+': nums.push(num); break; case '-': nums.push(-num); break; case '*': pre=nums.top(); nums.pop(); nums.push(pre*num); break; case '/': pre=nums.top(); nums.pop(); nums.push(pre/num); break; } sign = s[i]; num = 0; } i++; } while(!nums.empty()){ res += nums.top(); nums.pop(); } return res; } };