Cod sursa(job #163457)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 22 martie 2008 12:10:05
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
//#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;
}