Cod sursa(job #3223069)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 12 aprilie 2024 12:31:18
Problema Evaluarea unei expresii Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#warning That's the baby, that's not my baby

typedef long long ll;

int ptr = 0;
std::string s;

int eval();
int termen();
int factor();

int getnr() {
  int ret = 0;
  while (ptr < (int) s.size() && isdigit(s[ptr])) {
    ret = ret * 10 + s[ptr++] - '0';
  }
  return ret;
}

int factor() {
  int ret = 0;
  if (ptr < (int) s.size()) {
    if (s[ptr] == '(') {
      ptr++;
      ret = eval();
      ptr++;
    } else {
      ret = getnr();
    }
  }
  return ret;
}

int termen() {
  int ret = factor();
  while (ptr < (int) s.size() && (s[ptr] == '*' || s[ptr] == '/')) {
    if (s[ptr] == '*') {
      ptr++;
      ret *= factor();
    } else {
      ptr++;
      ret /= factor();
    }
  }
  return ret;
}

int eval() {
  int ret = termen();
  while (ptr < (int) s.size() && (s[ptr] == '+' || s[ptr] == '-')) {
    if (s[ptr] == '+') {
      ptr++;
      ret += termen();
    } else {
      ptr++;
      ret += termen();
    }
  }
  return ret;
}

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(0);
  std::cout.tie(0);

#ifndef LOCAL
  freopen("evaluare.in", "r", stdin);
  freopen("evaluare.out", "w", stdout);
#endif

  std::cin >> s;
  std::cout << eval();


  return 0;
}