Pagini recente » Cod sursa (job #939080) | Cod sursa (job #1572887) | Cod sursa (job #1153268) | Cod sursa (job #229925) | Cod sursa (job #288714)
Cod sursa(job #288714)
#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;
}
int main()
{int i,p,vf=0,lg=-1,ok;
long a,b;
freopen("evaluare.in","rt",stdin);
freopen("evaluare.out","wt",stdout);
gets(expresie);
for(i=0;i<strlen(expresie);)
{ok=0;
while(expresie[i]>='0'&&expresie[i]<='9')
forma[++lg]=expresie[i++],ok=1;
if(ok) forma[++lg]='.';
if(ok==0)
{
p=prioritate(expresie[i]);
if(p==0) st[++vf]='(',++i;
else if(p==4)
{while(st[vf]!='('&&vf)
forma[++lg]=st[vf--];
++i; vf--;
}
else while(prioritate(expresie[i])>0&&prioritate(expresie[i])<4)
{
p=prioritate(expresie[i]);
if(p==3) st[++vf]=expresie[i];
else if(p==prioritate(st[vf]))
{forma[++lg]=st[vf];
st[vf]=expresie[i];
}
else if(p>prioritate(st[vf])) st[++vf]=expresie[i];
else forma[++lg]=st[vf],st[vf]=expresie[i];
++i;
}
}
}
while(vf) forma[++lg]=st[vf--];
vf=1;
for(i=0;i<strlen(forma);++i)
if(forma[i]>='0'&&forma[i]<='9')
{v[vf++]=atol(forma+i);
while(forma[i]>='0'&&forma[i]<'9') ++i;
}
else if(prioritate(forma[i])>0&&prioritate(forma[i])<4)
{a=v[--vf]; b=v[--vf];
switch(forma[i])
{
case '+': v[vf]=b+a;break;
case '-': v[vf]=b-a;break;
case '*': v[vf]=b*a;break;
case '/': v[vf]=b/a;break;
case '^': v[vf]=powl(b,a);break;
} ++vf;
}
printf("%ld\n",v[vf-1]);
return 0;
}