Cod sursa(job #2739074)

Utilizator avtobusAvtobus avtobus Data 6 aprilie 2021 19:32:23
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < (int)(n); i++)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

ifstream fin {"evaluare.in"};
ofstream fout {"evaluare.out"};

string s;
size_t pos = 0, n;

/*
lvl= 0 (+,  -)
lvl= 1 (*,  /)
lvl= 2 (\d, ())
*/
const string ops[] = { "+-", "*/", "" };
const int LMAX = 2;

inline int calc(int a, int b, char op) {
  int res = 0;
  switch(op) {
    case '+':
      res = a+b; break;
    case '-':
      res = a-b; break;
    case '*':
      res = a*b; break;
    case '/':
      res = a/b; break;
  }
  return res;
}

int eval(int lvl) {
  if (pos >= s.size()) { return 0; /* error */ }
  int res = 0;
  if (lvl == LMAX) {
    if (s[pos] == '(') {
      pos++;
      res = eval(0);
      pos++;
    } else {
      while(pos < s.size() && '0' <= s[pos] && s[pos] <= '9') {
        res = res * 10 + s[pos] - '0';
        pos++;
      }
    }
  } else {
    res = eval(lvl+1);
    while(pos < s.size() && ops[lvl].find(s[pos]) != string::npos) {
      char op = s[pos];
      pos++;
      res = calc(res, eval(lvl+1), op);
    }
  }
  return res;
}

int main(void) {
  // freopen("evaluare.in", "r", stdin);
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL);

  fin >> s;
  auto ans = eval(0);
  fout << ans << "\n";
  return 0;
}