"(1+(4+5+2)-3)+(6+8)" = 23
題目分析:
這道題是標準算數(shù)表達式的一個變式,區(qū)別在于題目之中的有括號有省略的情況。所以整體思路為:雙棧,一個棧stack放操作數(shù),一個棧opr放操作符。
思路:遇到+ 、-、(的時候,操作符壓棧opr
遇到)的時候,從stack 和opr中彈出計算需要的操作數(shù)個數(shù),同時把結(jié)果壓棧stack,直到遇到(為止
在計算完這一組括號了之后,持續(xù)計算,到上一個(為止,這是處理()中的數(shù)作為一個操作數(shù)的情況
遇到數(shù)字的情況,壓棧,同時計算到(為止,這是保證從左到右的運算數(shù)據(jù)
注: 也可以以后綴表達的角度來理解這道題。
/** * @param {string} s * @return {number} */var calculate = function(s) { var string = []; for(var i=0; i<s.length; i++){ if(s[i] == ' ') continue; var str = ""; while(s[i]-'0'>=0 && s[i] -'9'<=0){ str += s[i]; i++; } if(str.length > 0) string.push(str); s[i] && string.push(s[i]); } var stack = [],opr = [],i=0,len=string.length; while(i<len){ if(string[i] =='+'|| string[i]== '-' || string[i] == '('){ opr.push(string[i]); i++; }else if(string[i] == ')'){ while(opr[opr.length-1] !== '('){ var n2 = stack.pop(), n1 = stack.pop(), op = opr.pop(); stack.push(op == '+'? n1+n2: n1-n2); } opr.pop(); // 去掉( while(opr.length>0 && opr[opr.length-1]!== '('){//把前面的運算式都計算了 var n2 = stack.pop(), n1 = stack.pop(), op = opr.pop(); stack.push(op == '+'? n1+n2: n1-n2); } i++; }else{ stack.push(parseInt(string[i],10)); while(opr.length>0 && opr[opr.length-1]!== '('){//把前面的運算式都計算了 var n2 = stack.pop(), n1 = stack.pop(), op = opr.pop(); stack.push(op == '+'? n1+n2: n1-n2); } i++; } } return stack.pop(); };
新聞熱點
疑難解答