Cod sursa(job #2447277)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 12 august 2019 17:41:58
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include<cstring>
#include<iostream>
#include<fstream>
#include<cmath>
#define LgMax 100000
using namespace std;

struct Nod
{
    char inf;
    Nod *st, *dr;
    int is_number;
};

Nod *root;
char e[LgMax];
int lg;
Nod *CreareArbore(int &i);
Nod *Factor(int &i);
Nod *Termen(int &i);

Nod *Factor(int &i)
{
    Nod *p;
    if(e[i]=='(')
    {
        i++;
        p=CreareArbore(i);
        i++;
        return p;
    }
    p=new Nod;
    //p->inf=e[i++];
    int nr=0,x;
    while(isdigit(e[i]))
    {
        nr=nr*10+(int)(e[i]-'0');
        i++;
    }
    p->inf=nr;
    p->is_number=1;
    p->st=p->dr=NULL;
    return p;
}

Nod *Termen(int &i)
{
    Nod *p,*r1;
    r1=Factor(i);
    if(i<=lg && (e[i]=='*')||(e[i]=='/') )
    {p=new Nod;
    p->inf=e[i++];
    p->st=r1;
    p->dr=Termen(i);
    return p;
    }
    else
        return r1;
}


Nod *CreareArbore(int &i)
{
    Nod *p,*r1;
    if(i>lg) return NULL;
    r1=Termen(i);
    if(i>lg || e[i]==')') return r1;
    p=new Nod;
    p->inf=e[i++];
    //cout<<p->inf;
    p->st=r1;
    p->dr=CreareArbore(i);
    return p;
}

void preordine(Nod *root)
{
    if(root!=NULL)
    {
        if(root->is_number) cout<<(int)root->inf<<' ';
        else cout<<root->inf;
        preordine(root->st);
        preordine(root->dr);
    }
}

//Orice nod are 0 sau 2 fii

bool is_leaf(Nod *p)
{
    if(p->st==NULL && p->dr==NULL)
        return 1;
    return 0;
}

int calc(Nod *p)
{
    //if(p!=NULL)
    if(is_leaf(p))
        return (int)p->inf;
    else
    {
        int A,B;
        A=calc(p->st);
        B=calc(p->dr);
        if(p->inf=='+') return A+B;
        else if(p->inf=='*') return A*B;
        else if(p->inf=='-') return A-B;
        else return A/B;

    }
}



int main()
{
    int i=0;
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    fin.getline(e,LgMax);
    lg=strlen(e)-1;
    root=CreareArbore(i);
    //preordine(root);
    fout<<calc(root);
    fin.close();
    fout.close();
}