Link:https://leetcode.com/problems/basic-calculator/
思路
- 如果是数字则更新当前数字
- 如果是操作符+或者-,那么需要重新计算当前结果,并把num设为0,sign设为正负
- 如果当前是(,说明小括号的内容需要优先计算,所以要把rst和sign入栈,更新rst和sign为原始值
- 如果当前是),那么说明当前括号里的内容已经计算完毕,所以要把之前的结果出栈,然后计算整个式子的结果
- 最后,当所有数字结束的时候,需要把结果进行计算,确保结果是正确的。
var calculate = function(s) { let numberStack = [], operationStack = []; let num=0, rst = 0, sign=1, i=0; while(i<s.length) { if(!isNaN(s[i])) { if(s[i]!=' ') { // 更新数字 num = num * 10 + Number(s[i]); } } else { rst += sign * num; // 这里重新计算了 num=0; if(s[i] === '+') sign = 1; if(s[i] === '-') sign = -1; // 把计算内容先保存 if(s[i] === '(') { numberStack.push(rst); operationStack.push(sign); rst=0; sign=1; } if(s[i] === ')' && operationStack.length !== 0) { // rst 为括号内的计算值, numberStack是先前保存的计算值 rst = operationStack.pop() * rst + numberStack.pop(); } } i++; } // 计算最后一个值 rst += sign * num; return rst;}