Pagini recente » Cod sursa (job #1105174) | Cod sursa (job #132296) | Cod sursa (job #444504) | Cod sursa (job #1251870) | Cod sursa (job #721731)
Cod sursa(job #721731)
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
char e[100002],p[100002];
long long i,lg,l,k,nr;
struct {long long nr,v;} marime[100002];
void TransformExpresie();
void TransformTermen();
void TransformFactor();
long long Evalexp();
long long eval(char);
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
gets(e);
lg=strlen(e)-1;
i=0;
TransformExpresie();
i=strlen(p)-1;
printf("%ld\n",Evalexp());
return 0;
}
void TransformFactor()
{
if(e[i]=='(')
{
i++;
TransformExpresie();
i++;
}
else
{
l=strlen(p);
if(e[i]>='0'&&e[i]<='9')
{
k++;nr=0;
while(e[i]>='0'&&e[i]<='9')
{
nr=nr*10+int(e[i])-48;
p[l]=e[i];
p[l+1]='\0';
i++;l=strlen(p);
marime[k].nr++;
}
marime[k].v=nr;
}
else
{
p[l]=e[i];
p[l+1]='\0';
i++;
}
}
}
void TransformTermen()
{
char ch;
TransformFactor();
while(i<=lg&&(e[i]=='*'||e[i]=='/'))
{
ch=e[i];i++;
TransformFactor();
if(ch=='*')
strcat(p,"*");
else
strcat(p,"/");
}
}
void TransformExpresie()
{
char ch;
TransformTermen();
while(i<=lg&&(e[i]=='+'||e[i]=='-'))
{
ch=e[i];i++;
TransformTermen();
if(ch=='+')
strcat(p,"+");
else
strcat(p,"-");
}
}
long long eval(char c)
{
k--;
i-=marime[k+1].nr;
return marime[k+1].v;
}
long long Evalexp()
{
long long e1,e2;
if(p[i]=='+')
{
i--;
e1=Evalexp();
e2=Evalexp();
return e1+e2;
}
else
if(p[i]=='-')
{
i--;
e1=Evalexp();
e2=Evalexp();
return e2-e1;
}
else
if(p[i]=='*')
{
i--;
e1=Evalexp();
e2=Evalexp();
return e1*e2;
}
else
if(p[i]=='/')
{
i--;
e1=Evalexp();
e2=Evalexp();
return e2/e1;
}
else
{
return eval(p[i]);
}
}