Pagini recente » Cod sursa (job #214885) | Cod sursa (job #2330763) | Cod sursa (job #3030984) | Cod sursa (job #28326) | Cod sursa (job #893959)
Cod sursa(job #893959)
#include<stdio.h>
#include<string.h>
#define NMAX 100000
int stNr[NMAX],prior[256],l,uOp,uNr;
char stOp[NMAX],s[NMAX+2];
void initializare()
{
prior[')']=1;
prior['+']=prior['-']=2;
prior['*']=prior['/']=3;
}
void citire()
{
freopen("evaluare.in","r",stdin);
scanf("%s",s);
l=strlen(s);
}
int efectuare(int x,int y,char op)
{
switch(op)
{
case '+': return x+y;
case '-': return x-y;
case '*': return x*y;
case '/': return x/y;
}
}
void eval()
{
int x=0,p=1;
for(int i=l-1;i>=0;i--)
{
if(s[i]<='9' && s[i]>='0')
{
x=x+(s[i]-'0')*p;
p=p*10;
}
else
{
if(s[i]!='(')
{
if(s[i]!=')')
{
if(p!=1)
{
stNr[++uNr]=x;
x=0;
p=1;
}
while(prior[s[i]]<prior[stOp[uOp]] && uOp>0 && uNr>0)
{
stNr[uNr-1]=efectuare(stNr[uNr],stNr[uNr-1],stOp[uOp]);
uNr--;
uOp--;
}
}
stOp[++uOp]=s[i];
}
if(s[i]=='(')
{
if(p!=1)
{
stNr[++uNr]=x;
x=0;
p=1;
}
while(stOp[uOp]!=')' && uOp>0 && uNr>0)
{
stNr[uNr-1]=efectuare(stNr[uNr],stNr[uNr-1],stOp[uOp]);
uNr--;
uOp--;
}
uOp--;
}
}
}
if(p!=1)
{
stNr[++uNr]=x;
x=0;
p=1;
}
while(uOp!=0 && uNr!=0)
{
stNr[uNr-1]=efectuare(stNr[uNr],stNr[uNr-1],stOp[uOp]);
uNr--;
uOp--;
}
}
void afisare()
{
freopen("evaluare.out","w",stdout);
printf("%d",stNr[1]);
}
int main()
{
initializare();
citire();
eval();
afisare();
return 0;
}