Link:https://leetcode.com/problems/basic-calculator/

思路

  • 如果是数字则更新当前数字
  • 如果是操作符+或者-,那么需要重新计算当前结果,并把num设为0,sign设为正负
  • 如果当前是(,说明小括号的内容需要优先计算,所以要把rst和sign入栈,更新rst和sign为原始值
  • 如果当前是),那么说明当前括号里的内容已经计算完毕,所以要把之前的结果出栈,然后计算整个式子的结果
  • 最后,当所有数字结束的时候,需要把结果进行计算,确保结果是正确的。
  1. var calculate = function(s) {
  2. let numberStack = [], operationStack = [];
  3. let num=0, rst = 0, sign=1, i=0;
  4. while(i<s.length) {
  5. if(!isNaN(s[i])) {
  6. if(s[i]!=' ') {
  7. // 更新数字
  8. num = num * 10 + Number(s[i]);
  9. }
  10. } else {
  11. rst += sign * num;
  12. // 这里重新计算了
  13. num=0;
  14. if(s[i] === '+') sign = 1;
  15. if(s[i] === '-') sign = -1;
  16. // 把计算内容先保存
  17. if(s[i] === '(') {
  18. numberStack.push(rst);
  19. operationStack.push(sign);
  20. rst=0;
  21. sign=1;
  22. }
  23. if(s[i] === ')' && operationStack.length !== 0) {
  24. // rst 为括号内的计算值, numberStack是先前保存的计算值
  25. rst = operationStack.pop() * rst + numberStack.pop();
  26. }
  27. }
  28. i++;
  29. }
  30. // 计算最后一个值
  31. rst += sign * num;
  32. return rst;
  33. }