Pagini recente » Cod sursa (job #2860447) | Cod sursa (job #2219588) | Cod sursa (job #1067811) | Cod sursa (job #1577599) | Cod sursa (job #2675685)
#include <cstdio>
#include <cstring>
#define NMAX 100000
using namespace std;
int stNum[NMAX+3],vfOp=0,vfNum=0;
char v[NMAX+3],op[NMAX+3];
FILE *fin,*fout;
int calc(int a,int b,char oper)
{
if(oper=='+')
{
return a+b;
}
else if(oper=='-')
{
return a-b;
}
else if(oper=='*')
{
return a*b;
}
else if(oper=='/')
{
return a/b;
}
}
int oper(char x)
{
if(x=='+')
{
return 1;
}
else if(x=='-')
{
return 1;
}
else if(x=='*')
{
return 2;
}
else if(x=='/')
{
return 2;
}
return 0;
}
void afis()
{
for(int i=1; i<=vfOp; i++)
{
fprintf(fout,"%c",op[i]);
}
fprintf(fout,"\n");
for(int i=1; i<=vfNum; i++)
{
fprintf(fout,"%d ",stNum[i]);
}
fprintf(fout,"\n\n");
}
int main()
{
fin=fopen("evaluare.in","r");
fout=fopen("evaluare.out","w");
fgets(v,NMAX+3,fin);
int n=strlen(v);
n--;
for(int i=0; i<n; i++)
{
char ch=v[i];
if(ch=='(')
{
//il pun in stiva de operatori
vfOp++;
op[vfOp]=ch;
}
else if(ch==')')
{
//fprintf(fout,"%c ",ch);
//elimin din stiva pana cand gasesc '('
while(op[vfOp]!='(')
{
int rez=calc(stNum[vfNum],stNum[vfNum-1],op[vfOp]);
vfOp--;
vfNum--;
stNum[vfNum]=rez;
}
vfOp--;
}
else
{
if(ch>='0' && ch<='9')
{
//am cifra aici
int num=0;
while(i<=n && v[i]>='0' && v[i]<='9')
{
num=num*10+v[i]-'0';
i++;
}
i--;
vfNum++;
stNum[vfNum]=num;
}
else
{
//am un operator
while(vfOp>0 && oper(ch)<=oper(op[vfOp]))
{
int rez=calc(stNum[vfNum],stNum[vfNum-1],op[vfOp]);
vfOp--;
vfNum--;
stNum[vfNum]=rez;
}
vfOp++;
op[vfOp]=ch;
}
}
//afis();
}
while(vfOp>0)
{
int rez=calc(stNum[vfNum-1],stNum[vfNum],op[vfOp]);
vfOp--;
vfNum--;
stNum[vfNum]=rez;
}
fprintf(fout,"%d",stNum[1]);
return 0;
}