Cod sursa(job #326457)

Utilizator IoannaPandele Ioana Ioanna Data 25 iunie 2009 11:07:26
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include<stdio.h>
#include<string.h>
long n,np,no;
long e[1010];
char s[100010],polo[100010][12],op[100010];

void read()
{
scanf("%s",s);
n=strlen(s);
}

void poloneza()
{
long i,nr=-1;
no=-1;
char man[14];
for (i=0;i<n;i++)
    {
     if (s[i]>='0' && s[i]<='9')
        {
         man[++nr]=s[i];
        }
     else
        {
         if (nr>=0)
            {
             man[++nr]=NULL;
             strcpy(polo[++np],man);
             nr=-1;
            }
          if (s[i]=='(')
             {
              op[++no]=s[i];
             }
         else if (s[i]==')')
                 {
                  while (op[no]!='(')
                        {
                         man[0]=op[no];
                         man[1]=NULL;
                         strcpy(polo[++np],man);
                         no--;
                        }
                   no--;
                 }
               else if (s[i]=='/' || s[i]=='*')
                        op[++no]=s[i];
                   else {
                         while (no>=0 && (op[no]=='/' || op[no]=='*'))
                               {
                                man[0]=op[no];
                                man[1]=NULL;
                                strcpy(polo[++np],man);
                                no--;
                               }
                        op[++no]=s[i];
                       }
            }
       }
if (nr>=0)
   {
    man[++nr]=NULL;
    strcpy(polo[++np],man);
   }
while (no>=0)
      {
        man[0]=op[no];
        man[1]=NULL;
        strcpy(polo[++np],man);
        no--;
      }

}

void number(long &a,char s[])
{
a=0;
long i,n;
n=strlen(s);
for (i=0;i<n;i++)
    {
     a=a*10+s[i]-'0';
    }
}

void eval()
{
long i,a,t=0;
for (i=1;i<=np;i++)
    {
     if (polo[i][0]>='0' && polo[i][0]<='9')
        {
         number(a,polo[i]);
         e[++t]=a;
        }
     else switch (polo[i][0])
         {
          case '+':{e[t-1]=e[t]+e[t-1];t--;break;}
          case '-':{e[t-1]=e[t-1]-e[t];t--;break;}
          case '*':{e[t-1]=e[t-1]*e[t];t--;break;}
          case '/':{e[t-1]=e[t-1]/e[t];t--;break;}
          }
  }
printf("%ld",e[t]);
}

int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
read();
poloneza();
eval();
return 0;
}