Pagini recente » Cod sursa (job #387070) | Cod sursa (job #171309) | Cod sursa (job #3157140) | Rating Matei Sonia (matei.sonia) | Cod sursa (job #288981)
Cod sursa(job #288981)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
char expresie[100001],forma[100001],st[100001];
long v[100001];
inline int prioritate(char op)
{
if(op=='(') return 0;
if(op=='+') return 1;
if(op=='-') return 1;
if(op=='/') return 2;
if(op=='*') return 2;
if(op=='^') return 3;
if(op==')') return 4;
return -1;
}
void transform()
{int i=0,lg=-1,vf=0,ok,p;
gets(expresie);
while(i<strlen(expresie))
{ok=0;
while(expresie[i]>='0'&&expresie[i]<='9')
forma[++lg]=expresie[i++],ok=1;
if(ok) forma[++lg]='.';
else
{p=prioritate(expresie[i]);
if(p==0) st[++vf]=expresie[i++];
else if(p==4) {while(st[vf]!='('&&vf)
forma[++lg]=st[vf--];
++i; --vf;
}
else if(p==3) st[++vf]=expresie[i++];
else {while(vf&&p<=prioritate(st[vf]))
forma[++lg]=st[vf--];
st[++vf]=expresie[i++];
}
}
}
while(vf) forma[++lg]=st[vf--];
}
long evaluate()
{
long i,b,a,vf=1;
for(i=0;i<strlen(forma);)
if(forma[i]>='0'&&forma[i]<='9')
{v[vf++]=atol(forma+i);
while(forma[i]>='0'&&forma[i]<='9') ++i;
}
else {if(forma[i]!='.')
{
b=v[--vf]; a=v[--vf];
switch(forma[i])
{
case '+': v[vf]=a+b;break;
case '-': v[vf]=a-b;break;
case '*': v[vf]=a*b;break;
case '/': v[vf]=a/b;break;
case '^': v[vf]=powl(a,b);break;
} ++vf;
}++i;
}
return v[1];
}
int main()
{
freopen("evaluare.in","rt",stdin);
freopen("evaluare.out","wt",stdout);
transform();
printf("%ld\n",evaluate());
return 0;
}