Pagini recente » Cod sursa (job #881318) | Cod sursa (job #1394433) | Cod sursa (job #498747) | Cod sursa (job #665944) | Cod sursa (job #1006331)
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
char s[100001];
struct nod
{
char x;
int y,e;
nod *s,*d;
};
void init(nod *&p)
{
p=new nod;
p->s=NULL;
p->d=NULL;
}
int numar(int x,int y)
{
s[y]='\0';
int z=atoi(s+x);
return z;
}
nod *fp(int x,int y)
{
int i,poz=-1,e=0,nr=0;
nod *p;
init(p);
for(i=x;i<y;++i)
{
if(s[i]=='(') ++nr;
else
{
if(s[i]==')') --nr;
else
{
if(!nr)
{
if(s[i]=='*'||s[i]=='/') poz=i;
else if(s[i]=='-'||s[i]=='+') e=i;
}
}
}
}
if(e)
{
p->e=1;
p->x=s[e];
p->s=fp(x,e);
p->d=fp(e+1,y);
}
else
{
if(poz==-1)
{
if(s[x]=='(') p=fp(x+1,y-1);
else
{
p->e=0;
p->y=numar(x,y);
}
}
else
{
p->e=1;
p->x=s[poz];
p->s=fp(x,poz);
p->d=fp(poz+1,y);
}
}
return p;
}
int ev(nod *p)
{
if(p->e)
{
switch(p->x)
{
case '-': return ev(p->s)-ev(p->d);
case '+': return ev(p->s)+ev(p->d);
case '*': return ev(p->s)*ev(p->d);
case '/': return ev(p->s)/ev(p->d);
}
}
return p->y;
}
void scrie(nod *p)
{
if(p)
{
scrie(p->s);scrie(p->d);
if(p->e)printf("%c ",p->x);
else printf("%d ",p->y);
}
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
nod *p;
scanf("%s",s);
p=fp(0,strlen(s));
//scrie(p);
printf("%d\n",ev(p));
return 0;
}