Cod sursa(job #2870961)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 12 martie 2022 18:57:06
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cassert>

using namespace std;


const int N = 100000 + 7;
char s[N];
int n;
int p;

int readNum() {
  assert('0' <= s[p] && s[p] <= '9');
  int sol = 0;
  while (p < n && '0' <= s[p] && s[p] <= '9') {
    sol = 10 * sol + s[p++] - '0';
  }
  return sol;
}

int solve() {
  assert(p < n);
  int sol = 1;
  while (p < n && (s[p] == '+' || s[p] == '-')) {
    if (s[p++] == '-') {
      sol *= -1;
    }
  }
  if (s[p] == '(') {
    p++;
    sol *= solve();
    assert(s[p] == ')');
    p++;
  }
  else {
    sol *= readNum();
  }
  while (p < n && (s[p] == '*' || s[p] == '/')) {
    bool is_mul = (s[p++] == '*');
    int cur = 1;
    assert(p < n);

    if (s[p] == '(') {
      p++;
      cur = solve();
      assert(s[p] == ')');
      p++;
    }
    else {
      cur = readNum();
    }
    if (is_mul) {
      sol *= cur;
    }
    else {
      sol /= cur;
    }
  }
  if (p < n && (s[p] == '+' || s[p] == '-')) {
    sol += solve();
  }
  return sol;
}

int main() {
  freopen("evaluare.in", "r", stdin);
  freopen("evaluare.out", "w", stdout);

  scanf("%s", &s);
  n = strlen(s);

  cout << solve() << "\n";
}