Basic Calculator II

MediumMathStringStack

Solution

export function calculate(s: string): number {
  function isDigit(char: string) {
    return /^[0-9]$/.test(char);
  }
  function isSign(char: string) {
    return /^[+*/-]$/.test(char);
  }
 
  const n = s.length;
  const stack: number[] = [];
  let num = 0;
  let sign = '+';
  for (let i = 0; i < n; i++) {
    const char = s[i];
    if (isDigit(char)) {
      num = 10 * num + parseInt(char);
    }
    if (isSign(char) || i === n - 1) {
      if (sign === '+') {
        stack.push(num);
      } else if (sign === '-') {
        stack.push(-num);
      } else if (sign === '*') {
        stack.push(stack.pop()! * num);
      } else {
        stack.push(Math.trunc(stack.pop()! / num));
      }
      num = 0;
      sign = char;
    }
  }
 
  return stack.reduce((acc, num) => acc + num, 0);
}