Pagini recente » Cod sursa (job #899390) | Cod sursa (job #2252613) | Cod sursa (job #3252592) | Cod sursa (job #532793) | Cod sursa (job #1392316)
#include<stdio.h>
#define LMAX 100001
char stc[LMAX] , s[LMAX];
int nr , op, semn = 1 , stn[LMAX];
void prod();
void sum();
int main()
{
int i;
freopen("evaluare.in" , "r" , stdin );
freopen("evaluare.out" , "w" , stdout );
scanf("%s" , s+1 );
i = 1;
while(s[i]){
if(s[i] >= '0' && s[i] <= '9'){
stn[++nr] = 0;
while(s[i] >= '0' && s[i] <= '9'){
stn[nr] = stn[nr]*10 + s[i] - 48;
i++;
}
stn[nr]*=semn;
semn = 1;
continue;
}
if( s[i] == '*' || s[i] == '/' || s[i] == '(' )
stc[++op] = s[i];
else
if(s[i] == ')'){
prod();
sum();
if(stc[op] == '('){
op--;
i++;
continue;
}
}
else
if(s[i] == '-' && !( s[i-1] >= '0' && s[i-1] <= '9') && s[i-1] != ')')
semn = -1;
else{
prod();
stc[++op] = s[i];
}
i++;
}
prod();
sum();
printf("%d\n" , stn[1]);
return 0;
}
void sum()
{
int newNr = nr-1 , newOp = op;
if(stc[op] != '+' && stc[op] != '-')
return;
while(stc[newOp-1] == '+' || stc[newOp-1] == '-')
newOp--, newNr--;
for(int i = newOp , j = 1 ; i <= op ; ++i , ++j )
if(stc[i] == '+')
stn[newNr] += stn[newNr+j];
else
stn[newNr] -= stn[newNr+j];
op = newOp-1;
nr = newNr;
}
void prod()
{
int newNr = nr-1 , newOp = op;
if(stc[op] != '*' && stc[op] != '/')
return;
while(stc[newOp-1] == '*' || stc[newOp-1] == '/')
newOp--, newNr--;
for(int i = newOp , j = 1 ; i <= op ; ++i , ++j )
if(stc[i] == '*')
stn[newNr] *= stn[newNr+j];
else
stn[newNr] /= stn[newNr+j];
op = newOp-1;
nr = newNr;
}