Pagini recente » Cod sursa (job #381040) | Cod sursa (job #2149643) | Monitorul de evaluare | Cod sursa (job #1298876) | Cod sursa (job #161946)
Cod sursa(job #161946)
#include <string.h>
#include <stdio.h>
#define N 100000
#define M 100001
union op
{char operatie;
long constanta;
// char variabila;
}postfix[N];
long vfp;
char line[M],*c;
char stack[N];
char flag[N];
long stack2[N];
long vfs;
void adauga_stiva(char c)
{stack[++vfs]=c;}
char scoate_stiva()
{return stack[vfs--];}
void adauga_postfix_op(char c)
{flag[++vfp]=0;
postfix[vfp].operatie=c;
}
void adauga_postfix_ct(long c)
{flag[++vfp]=1;
postfix[vfp].constanta=c;
}
int main ()
{vfs=vfp=0;
char opr[10]={"+-*/"};
long r;
int i,a,b;
FILE *f=fopen("evaluare.in","r");
fscanf(f,"%s",line);
c=line;
while(*c!=NULL)
{if(*c=='(')
{adauga_stiva('(');
}
else if(*c==')')
{while(stack[vfs]!='(')
{adauga_postfix_op(scoate_stiva());
}
scoate_stiva();
}
else if(strchr(opr,*c))
{if(vfs==0)
adauga_stiva(*c);
else if((strchr(opr,*c)-opr)/2>(strchr(opr,stack[vfs])-opr)/2)
{adauga_stiva(*c);
}
else
{while((strchr(opr,*c)-opr)/2<(strchr(opr,stack[vfs])-opr)/2&&vfs)
{adauga_postfix_op(scoate_stiva());
}
adauga_stiva(*c);
}
}
if(!(*c>='0'&&*c<='9'))
{c++;
}
else
{for(r=0;*c>='0'&&*c<='9';c++)
{r=r*10+(*c)-'0';
}
adauga_postfix_ct(r);
}
}
while(vfs)
{adauga_postfix_op(scoate_stiva());
}
for(i=1,vfs=0;i<=vfp;i++)
{if(flag[i]==1)
{stack2[++vfs]=postfix[i].constanta;
}
else
{a=stack2[vfs--];b=stack2[vfs--];
switch(postfix[i].operatie)
{case '+': stack2[++vfs]=a+b;break;
case '*': stack2[++vfs]=a*b;break;
case '-': stack2[++vfs]=a-b;break;
case '/': stack2[++vfs]=a/b;break;
}
}
}
FILE *fout=fopen("evaluare.out","w");
fprintf(fout,"%ld",stack2[1]);
fclose(fout);
return 0;
}