Cod sursa(job #1107881)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 14 februarie 2014 17:57:38
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <string>
#include <vector>
#include <fstream>

using namespace std;

const int ADD = -1, SUB = -2, MUL = -3, DIV = -4, LP = -5, RP = -6;

string s;
vector<int> tokens;
vector<int>::iterator p;

inline bool is_digit(char c) {
  return c >= '0' && c <= '9';
}

void tokenize() {
  for(int i = 0; i < (int) s.size(); ++i) {
    if(s[i] == '+') tokens.push_back(ADD);
    else if(s[i] == '-') tokens.push_back(SUB);
    else if(s[i] == '*') tokens.push_back(MUL);
    else if(s[i] == '/') tokens.push_back(DIV);
    else if(s[i] == '(') tokens.push_back(LP);
    else if(s[i] == ')') tokens.push_back(RP);
    else {
      int x = 0;
      while(is_digit(s[i])) {
        x = x * 10 + (int) (s[i] - '0');
        i++;
      }
      tokens.push_back(x);
      i--;
    }
  }
}

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

int factor() {
  int x = *p;
  ++p;
  if(x == LP) {
    x = eval();
    ++p;
  }
  return x;
}

int termen() {
  int r = factor();
  while(p != tokens.end() && (*p == MUL || *p == DIV)) {
    int op = *p;
    ++p;
    if(op == MUL) {
      r *= factor();
    }
    if(op == DIV) {
      r /= factor();
    }
  }
  return r;
}

int eval() {
  int r = termen();
  while(p != tokens.end() && (*p == ADD || *p == SUB)) {
    int op = *p;
    ++p;
    if(op == ADD) {
      r += termen();
    }
    if(op == SUB) {
      r -= termen();
    }
  }
  return r;
}

int main(int argc, char *argv[]) {
  ifstream fi("evaluare.in");
  ofstream fo("evaluare.out");

  fi >> s;
  tokenize();
  p = tokens.begin();
  int result = eval();
  fo << result << endl;
  fo.close();

  return 0;
}