Cod sursa(job #1900450)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 3 martie 2017 13:10:58
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <cstring>
using namespace std;
char s[200000];
int poz, n;
int numar();
int parant();
int numar() {
  if (s[poz] == '(') {
    ++poz;
    return parant();
  }
  int val = 0;
  while (s[poz] >= '0' && s[poz] <= '9' && poz < n)  {
    val = val * 10 + s[poz] - '0';
    ++poz;
  }
  return val;
}
inline int ec (int a, int b, char s) {
  switch (s) {
  case '+':
    return a + b;
  case '-':
    return a - b;
  case '*':
    return a * b;
  case '/':
    return a / b;

  }
}
int parant() {
  int a, b, c;
  char s1, s2;
  a = numar();
  if (poz == n || s[poz] == ')') {
    ++poz;
    return a;
  }
  s1 = s[poz];
  ++poz;
  b = numar();
  if (poz == n || s[poz] == ')') {
    ++poz;
    return ec (a, b, s1);
  }
  while (poz != n && s[poz] != ')') {
    s2 = s[poz];
    ++poz;
    c = numar();
    if (s1 == '*' || s1 == '/') {
      a = ec (a, b, s1);
      b = c;
      s1 = s2;
    } else {
      if (s2 == '*' || s2 == '/')
        b = ec (b, c, s2);
      else {
        a = ec (a, b, s1);
        b = c;
        s1 = s2;
      }
    }
  }
  a = ec (a, b, s1);
  ++poz;
  return a;
}
int main() {
  freopen ("evaluare.in", "r", stdin);
  freopen ("evaluare.out", "w", stdout);
  gets (s);
  n = strlen (s);
  printf ("%d", parant());
  return 0;
}