Cod sursa(job #1970398)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 19 aprilie 2017 12:14:00
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
#include<cstring>
using namespace std;
char s[100001];
struct nod{int x; char c; nod *st,*dr;}*b;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
void fct(nod *p,int st,int dr)
{int aux=dr,nr=0;
while(aux>=st&&((s[aux]!='+'&&s[aux]!='-')||nr<0))
{if(s[aux]==')')
nr--;
else if(s[aux]=='(')
nr++;
aux--;
}
if(aux>=st)
{p->c=s[aux];
p->st=new nod;
fct(p->st,st,aux-1);
p->dr=new nod;
fct(p->dr,aux+1,dr);
return;
}
aux=dr;
nr=0;
while(aux>=st&&((s[aux]!='*'&&s[aux]!='/')||nr<0))
{if(s[aux]==')')
nr--;
else if(s[aux]=='(')
nr++;
aux--;
}
if(aux>=st)
{p->c=s[aux];
p->st=new nod;
fct(p->st,st,aux-1);
p->dr=new nod;
fct(p->dr,aux+1,dr);
return;
}
if(s[dr]==')')
{fct(p,st+1,dr-1);
return;
}
p->c=0;
p->x=0;
for(aux=st;aux<=dr;aux++)
p->x=p->x*10+s[aux]-48;
}
void solve(nod *p)
{if(p->c!=0)
{solve(p->st);
solve(p->dr);
switch(p->c)
{case '+':{p->x=p->st->x+p->dr->x;break;}
case '-':{p->x=p->st->x-p->dr->x;break;}
case '*':{p->x=p->st->x*p->dr->x;break;}
case '/':{p->x=p->st->x/p->dr->x;break;}
}
}
}
int main()
{f.get(s,1001);
b=new nod;
fct(b,0,strlen(s)-1);
solve(b);
g<<b->x;
return 0;
}