Cod sursa(job #153369)

Utilizator AlxCojocaru Alexandru Alx Data 10 martie 2008 14:44:42
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <string.h>
char s[100003],c;
struct trm
{
 long val;
 int tip;
};
trm t[100000];
long ns,niv,st[1000],nst;
int pri(char c)
{
 if (c=='*'||c=='/')
  return 2;
 if (c=='(')
  return 0;
 return 1;
}
int main()
{
 freopen("evaluare.in","r",stdin);
 freopen("evaluare.out","w",stdout);
 scanf("%c",&c);
 long i;
 while (c!='\n')
 {
  long nr=0;
  if (c>='0'&&c<='9')
  {
   while (c>='0'&&c<='9')
   {
    nr=nr*10+c-'0';
    scanf("%c",&c);
   }
   t[niv].val=nr;
   t[niv].tip=0;
   niv++;
  }
  if ((c<'0'||c>'9')&&c!=')'&&c!='\n')
  {
   while (ns&&pri(s[ns-1])>=pri(c))
   {
    ns--;
    switch (s[ns])
    {
     case '+':t[niv].val=1;break;
     case '-':t[niv].val=2;break;
     case '*':t[niv].val=3;break;
     case '/':t[niv].val=4;break;
    }
    t[niv].tip=1;
    niv++;
   }
   s[ns]=c;
   ns++;
  }
  if (c==')')
  {
   while (s[ns-1]!='(')
   {
    ns--;
    switch (s[ns])
    {
     case '+':t[niv].val=1;break;
     case '-':t[niv].val=2;break;
     case '*':t[niv].val=3;break;
     case '/':t[niv].val=4;break;
    }
    t[niv].tip=1;
    niv++;
   }
   ns--;
  }
  scanf("%c",&c);
 }
 while (ns)
 {
  ns--;
  switch (s[ns])
  {
   case '+':t[niv].val=1;break;
   case '-':t[niv].val=2;break;
   case '*':t[niv].val=3;break;
   case '/':t[niv].val=4;break;
  }
  t[niv].tip=1;
  niv++;
 }
 for (i=0;i<niv;i++)
  if (t[i].tip==0)
  {
   st[nst]=t[i].val;
   nst++;
  }
  else
  {
   nst--;
   switch (t[i].val)
   {
    case 1:st[nst-1]=st[nst-1]+st[nst];break;
    case 2:st[nst-1]=st[nst-1]-st[nst];break;
    case 3:st[nst-1]=st[nst-1]*st[nst];break;
    case 4:st[nst-1]=st[nst-1]/st[nst];break;
   }
  }
 printf("%ld\n",st[0]);
 return 0;
}