Problem p00109 (C++) — buggy submission, verdict: Runtime Error

#include <assert.h>
#include <stack>
#include <stdio.h>

char buf[128];
int pos;
#define NOW (buf[pos])

bool isdigit(char c) { return ('0' <= c && c <= '9'); }

bool isstrong(char c) { return (c == '*' || c == '/'); }
bool isweak(char c) { return (c == '+' || c == '-'); }

int digit() {
  if (!isdigit(NOW)) {
    fprintf(stderr, "%c: ", NOW);
    assert(isdigit(NOW));
  }
  int ret = NOW - '0';
  pos++;

  return ret;
}
int number() {
  int ret = digit();
  while (isdigit(NOW)) {
    ret = ret * 10 + digit();
  }
  return ret;
}

int main(void) {

  int set;
  scanf("%d", &set);

  while (set--) {
    scanf("%s", buf);
    pos = 0;

    std::stack<char> expr;
    std::stack<int> num;

    expr.push('(');

    while (true) {
      if (isdigit(NOW)) {
        num.push(number());
      } else {
        if (expr.top() == '(' && (NOW == ')' || NOW == '=')) {
          // 対応する括弧が出てきたので、スタック上の括弧を消す
          expr.pop();
          pos++;
          if (expr.empty()) {
            break;
          }
        } else if (expr.top() == '(' || NOW == '(' ||
                   (isstrong(NOW) && isweak(expr.top()))) {
          // 強い演算子はスタックに積んでおく。括弧が積んであるなら、無条件に積む
          expr.push(NOW);
          pos++;
        } else {
          // 次の演算子は弱いor同じだから、積んでるものを先に計算してしまおう
          char de = expr.top();
          expr.pop();

          int b = num.top();
          num.pop();
          int a = num.top();
          num.pop();
          int ans;
          switch (de) {
          case '+':
            ans = a + b;
            break;
          case '-':
            ans = a - b;
            break;
          case '*':
            ans = a * b;
            break;
          case '/':
            ans = a / b;
            break;
          }
          num.push(ans);
        }
      }
    }

    printf("%d\\n", num.top());
  }
}

Error: WA

Fixed submission:

#include <assert.h>
#include <stack>
#include <stdio.h>

char buf[128];
int pos;
#define NOW (buf[pos])

bool isdigit(char c) { return ('0' <= c && c <= '9'); }

bool isstrong(char c) { return (c == '*' || c == '/'); }
bool isweak(char c) { return (c == '+' || c == '-'); }

int digit() {
  if (!isdigit(NOW)) {
    fprintf(stderr, "%c: ", NOW);
    assert(isdigit(NOW));
  }
  int ret = NOW - '0';
  pos++;

  return ret;
}
int number() {
  int ret = digit();
  while (isdigit(NOW)) {
    ret = ret * 10 + digit();
  }
  return ret;
}

int main(void) {

  int set;
  scanf("%d", &set);

  while (set--) {
    scanf("%s", buf);
    std::stack<char> expr;
    std::stack<int> num;

    expr.push('(');

    while (true) {
      if (isdigit(NOW)) {
        num.push(number());
      } else {
        if (expr.top() == '(' && (NOW == ')' || NOW == '=')) {
          // 対応する括弧が出てきたので、スタック上の括弧を消す
          expr.pop();
          if (expr.empty()) {
            break;
          }
        } else if (expr.top() == '(' || NOW == '(' ||
                   (isstrong(NOW) && isweak(expr.top()))) {
          // 強い演算子はスタックに積んでおく。括弧が積んであるなら、無条件に積む
          expr.push(NOW);
          pos++;
        } else {
          // 次の演算子は弱いor同じだから、積んでるものを先に計算してしまおう
          char de = expr.top();
          expr.pop();

          int b = num.top();
          num.pop();
          int a = num.top();
          num.pop();
          int ans;
          switch (de) {
          case '+':
            ans = a + b;
            break;
          case '-':
            ans = a - b;
            break;
          case '*':
            ans = a * b;
            break;
          case '/':
            ans = a / b;
            break;
          }
          num.push(ans);
        }
      }
    }

    printf("%d\\n", num.top());
  }
}