Cod sursa(job #833228)

Utilizator radu.bRadu Brumariu radu.b Data 12 decembrie 2012 02:35:56
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <iostream>
#include <cstring>

#define MAXN 100000
#define LMAX 2 

char op[4][4] = { "+-", "*/", "^", "" };

std::ifstream in("evaluare.in");
std::ofstream out("evaluare.out");

char S[MAXN];
char* p;

struct node 
{
  char op;
  int val;
  struct node * l;
  struct node * r;
  node(int a = 0, char b = 0, struct node *c = 0, struct node *d = 0) : val(a),op(b),l(c),r(d){} 
} *root;

node* eval(int lvl);
long eval(node* r);

int main(void) {
  in.getline(S,MAXN);
  p = S;
  
  root = eval(0);
  long r = eval(root);
  out << r << std::endl;
  return 0;
}
	 
node* eval(int lvl)
{
  node* x;
  node* y;
  if(lvl == LMAX)
    {
      if(*p == '(')
	{
	  ++p;
	  x = eval(0);
	  ++p;
	} 
      else 
	{
	  for(x = new node; *p >= '0' && *p <= '9'; p++)
	    {
	      x->val = x->val*10 + *p - '0';
	    }
	}
    }
  else 
    {
      for(x = eval(lvl+1); strchr(op[lvl], *p) && *p != '\0'; x=y){
	y = new node(0, *p++, x, eval(lvl+1));
      }
    }
  return x;
}
  
long eval(node* r){
  long result = 0;
  switch(r->op){
  case '+':
    result = eval(r->l) + eval(r->r);
    break;
  case '-':
    result = eval(r->l) - eval(r->r);
    break;
  case '*':
    result = eval(r->l) * eval(r->r);
    break;
  case '/':
    result = eval(r->l) * eval(r->r);
    break;
  default:
    result = r->val;
    break;
  }
  return result;
}