Cod sursa(job #1798266)

Utilizator MKLOLDragos Ristache MKLOL Data 5 noiembrie 2016 06:38:25
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<bits/stdc++.h>
#include<stdio.h>
#include<cstring>
#include<stdlib.h>
#define pb push_back
using namespace std;
typedef long long ll;
#define fs first
#define sc second
#define mp make_pair
string gb;

int getnum(int st,int dr) {
  int ret = 0;
  for(int i=st;i<=dr;++i) {
    ret *= 10;
    ret += (gb[i] -'0');
  }
  return ret;
}

vector<vector<char>> ops;
inline int is(string &op, int loc,int st,int dr) {
  return op[0] == gb[loc];
}

inline int make(char op,int x,int y) {
  if(op == '-') return x-y;
  if(op == '+') return x+y;
  if(op == '/') return x/y;
  if(op == '*') return x*y;
}

inline int eval(int st,int dr, int lvl) {

  for(int t = lvl;t<ops.size();++t) {
      int par = 0;
      for(int i = dr;i>=st;--i) {
        if(gb[i] == '(') ++ par;
        if(gb[i] == ')') -- par;
        if(par) continue;
        
        for(auto op : ops[t]) {
          if(gb[i] == op) {
            return make(op,eval(st,i-1,t),eval(i+1,dr,t));
          }
        }
      }
  }
  if(gb[st] == '(') {
    return eval(st+1,dr-1,0);
  }
  return getnum(st,dr);
}

void init() {
  ops.pb(vector<char>({'+','-'})); // 4
  ops.pb(vector<char>({'/','*'})); // 5
}
char s[202020];
int eval() {
  gb = "";
  int a = strlen(s);
  for(int i = 0;i<a;++i) {
    char c = s[i];
    if(c != ' ') gb.pb(c);
  }
  int ret = eval(0,gb.size()-1,0);
  return ret;
}

int main() {
  freopen("evaluare.in","r",stdin);
  //freopen("evaluare.in","r",stdin);
  freopen("evaluare.out","w",stdout);
  
  init();
  scanf("%s",s);
  cout << eval();
  return 0;
}