Cod sursa(job #2323676)

Utilizator 3DwArDPauliuc Edward 3DwArD Data 19 ianuarie 2019 15:22:19
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 kb
#include <bits/stdc++.h>
using namespace std;
#define plus 1000000001
#define minus 1000000002
#define ori 1000000003
#define div 1000000004
int n;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
struct nod{
    int val;
    nod *st, *dr;
    nod(){st=NULL, dr=NULL,val=0;}
} *rad;
nod * cautare(nod *&a, int x){

    if( a != NULL){
        if(a->val == x)return a;
        if(a->val > x)return cautare(a->st,x);
        if(a->val < x)return cautare(a->dr,x);
    }
    return a;
}
void SDR(nod *node){
    if(node != NULL){
        if(node->st)SDR(node->st);
        if(node->dr)SDR(node->dr);
        g<<node->val<<" ";
    }
}
char sir[100050];
char *p;
char pr[2][3]={"+-","*/"};
nod * generare(int k){
    nod *x, *y;
    if(k==2){
        if(*p=='('){
            p++;
            x=generare(0);
            p++;
        }
        else{
            x = new nod;
            for(;*p>='0' && *p<='9'; p++){
                x->val = x->val*10 + (*p-'0');
            }
            x->st=0;
            x->dr=0;
        }
    }
    else{
        for(x= generare(k+1);strchr(pr[k], *p)&&(*p)!=0; x=y){
            y = new nod;
            switch (*p)
                {
                    case '+':y->val=plus;break;
                    case '-':y->val=minus;break;
                    case '*':y->val=ori;break;
                    case '/':y->val=div;break;
                }
            y->st = x;
            p++;
            y->dr= generare(k+1);
        }
    }
    return x;
}

int evaluare(nod*rad)
{
    switch(rad->val)
    {
        case plus: return evaluare(rad->st)+evaluare(rad->dr);break;
        case minus: return evaluare(rad->st)-evaluare(rad->dr);break;
        case ori: return evaluare(rad->st)*evaluare(rad->dr);break;
        case div: return evaluare(rad->st)/evaluare(rad->dr);break;
        default: return rad->val;
    }
}

int main()
{
    f.get(sir,100050);
    p=sir;
    rad = generare(0);
    g<<evaluare(rad);
    return 0;
}