Pagini recente » Borderou de evaluare (job #2080710) | Borderou de evaluare (job #2675984) | Borderou de evaluare (job #876688) | Cod sursa (job #495173) | Cod sursa (job #163457)
Cod sursa(job #163457)
//#include <string.h>
#include <stdio.h>
#define N 100005
char opstack[N];
char line[N];
long numstack[N];
long vfs;//acelasi varf pentru ambele stive
struct postfix
{char type;//0-op 1-num
union
{char op;
long num;
};
};
postfix post[N];
long vfp;
void pushop(char op)
{opstack[++vfs]=op;}
char popop()
{return opstack[vfs--];}
void pushnum(char num)
{numstack[++vfs]=num;}
long popnum()
{return numstack[vfs--];}
void appop(char op)
{vfp++;
post[vfp].type=0;
post[vfp].op=op;
}
void appnum(long num)
{vfp++;
post[vfp].type=1;
post[vfp].num=num;
}
int main ()
{FILE *f=fopen("evaluare.in","r");
FILE *fout=fopen("evaluare.out","w");
fgets(line,100,f);
//fscanf(f,"%s",&line);
char *c=line,p;
vfp=vfs=0;
char opr[]={"*+-/"};
long r;
while(*c)
{if(*c>='0'&&*c<='9')
{r=0;
while(*c>='0'&&*c<='9')
{r=r*10+*c-'0';
c++;
}
appnum(r);
}
else if (*c=='*'||*c=='+'||*c=='/'||*c=='-')
{while(vfs&&(*c=='+'||*c=='-')&&(opstack[vfs]=='*'||opstack[vfs]=='/'))
{appop(popop());
}
if(!((*c=='+'||*c=='-')&&(opstack[vfs]=='*'||opstack[vfs]=='/')))
{pushop(*c);
c++;
}
}
else if(*c=='(')
{pushop(*c);
c++;
}
else if(*c==')')
{while(opstack[vfs]!='(')
appop(popop());
popop();
c++;
}
}
while(vfs)
{appop(popop());}
int i,a,b;
for(i=1;i<=vfp;)
{while(post[i].type==1)//&&i<=vfp)
{pushnum(post[i].num);
i++;
}
a=popnum();
b=popnum();
switch(post[i].op)
{
case '+':r=a+b;break;
case '*':r=a*b;break;
case '-':r=b-a;break;
case '/':r=b/a;break;
}
i++;
pushnum(r);
}
fprintf(fout,"%ld",popnum());
fclose(fout);
return 0;
}