Basic Calculator

HardMathStringStackRecursion

Solution

export function calculate(s: string): number {
  const isDigit = (char: string) => {
    return /^\d$/.test(char);
  };
 
  const isOp = (char: string) => {
    return /^[+-]$/.test(char);
  };
 
  const nums: number[] = [];
  const signs: number[] = [];
  let [result, num, sign] = [0, 0, 1];
  for (const char of s) {
    if (isDigit(char)) {
      num = num * 10 + parseInt(char);
    } else if (isOp(char)) {
      result += sign * num;
      [num, sign] = [0, char === '+' ? 1 : -1];
    } else if (char === '(') {
      nums.push(result);
      signs.push(sign);
      [result, sign] = [0, 1];
    } else if (char === ')') {
      result += sign * num;
      result *= signs.pop() || 1;
      result += nums.pop() || 0;
      num = 0;
    }
  }
 
  return result + sign * num;
}