Cod sursa(job #1798261)

Utilizator MKLOLDragos Ristache MKLOL Data 5 noiembrie 2016 06:21:33
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include<bits/stdc++.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<string>> ops;
int is(string op, int loc,int st,int dr) {
  int epos = loc + op.size() - 1;
  if(epos > dr) return 0;
  int ok = 1;
  for(int i=0;i<op.size();++i) {
    if(i > dr) return 0;
    if(gb[i+loc] != op[i]) ok = 0;
    if(!ok) return 0;
  }
  return 1;
}

int make(string 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;
}

int eval(int st,int dr) {

  for(int t = 0;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(is(op,i,st,dr)) {
            return make(op,eval(st,i-1),eval(i+op.size(),dr));
          }
        }
      }
  }
  if(gb[st] == '(') {
    return eval(st+1,dr-1);
  }
  return getnum(st,dr);
}

void init() {
  ops.pb(vector<string>({"+","-"})); // 4
  ops.pb(vector<string>({"/","*"})); // 5
}

int eval(string s) {
  gb = "";
  for(auto c : s) {
    if(c != ' ') gb.pb(c);
  }
  int ret = eval(0,gb.size()-1);
  return ret;
}

int main() {
  init();
  cin.sync_with_stdio(false);
  string s;
  getline(cin,s);
  cout << eval(s);
  return 0;
}