Cod sursa(job #1903275)

Utilizator lucadDragomir Luca lucad Data 5 martie 2017 08:21:50
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.11 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int prioritate(char c)                 //functie care returneaza prioritatea operatorilor
{
    if(c=='('||c==')')return 0;
       else
         if(c=='+'||c=='-')return 1;
        else
            if(c=='*'||c=='/')return 2;
    return 0;
}
int main()
{
    char E[110003],FP[150003],S[110000], aux[4],sirnr[20],*p;
    int i,vf,nr,semn,S1[150000],R,k,l;
    FILE *f,*g;

    f=fopen("evaluare.in","r");
    g=fopen("evaluare.out","w");

    fscanf(f,"%s",E);             //citesc expresia care trebuie evaluata

    strcpy(FP,"(");               //copiez in FP (
    strcat(FP,E);                 //concatenez E la FP
    strcat(FP,")");               //concatenez la FP )
    strcpy(E,FP);                 //copiez in E FP

    FP[0]=0;  //forma poloneza postfixata (initial sirul vid)
    vf=0;            //varful stivei in care pastrez operatorii
    l=-1;     //indice in forma poloneza a expresiei
    for(i=0;E[i]!=0;i++)       //parcurg expresia
    {
        if(E[i]>='0' && E[i]<='9')   //daca E[i] este o cifra
        {
            if (E[i-1]=='-' && E[i-2]=='('&&i-2>=0) semn=-1; //verific daca in fata cifrei este -
                                                             //si in fata lui - (
                             else semn=1;                    //atunci semnul numarului este -
            if (semn==-1)
            {
                l++;
                FP[l]='-';  //adaug semnul - in forma poloneza
            }
            while(E[i]>='0' && E[i]<='9') //cat timp E[i] este cifra
            {
               l++;
               FP[l]=E[i]; //adaug cifrele numarului in forma poloneza
               i++;
            }
            l++;
            FP[l]=' '; //la finalul numarului adaug in forma poloneza un spatiu
            i--;
        }
         else
            if(E[i]=='+'||(E[i]=='-' &&E[i-1]!='(')||E[i]=='*'||E[i]=='/') //caracterul citit este operator
         {
             while(prioritate(S[vf])>=prioritate(E[i])) //cat timp prioritatea operatorului este <= cu cea
                                                        //a operatorului aflat in varful stivei
             {
                 l++;
                 FP[l]=S[vf]; //adaug in forma poloneza operatorul din stiva
                 l++;
                 FP[l]=' ';  //si un spatiu
                 vf--;       //extrag operatorul din stiva
             }
             vf++;
             S[vf]=E[i]; //adau E[i] in stiva
         }
           else
             if(E[i]=='(')
                {
                    vf++;
                    S[vf]=E[i];  //adaug in stiva paranteza deschisa (
                }
               else
               if(E[i]==')')
                {
                   while(S[vf]!='(') //extrag din stiva toti operatorii pana la ) si ii adaug in FP urmati de cate un spatiu
                   {
                       l++;
                       FP[l]=S[vf]; //adaug in forma poloneza operatorul
                       l++;
                       FP[l]=' ';  //si un spatiu
                       vf--;       //extrag operatorul din stiva
                   }
                   vf--;    //extrag si paranteza ( din stiva
                }
    }

    l++;
    FP[l]=0; //pun NULL la sfarsitul formei poloneze
    p=strtok(FP," "); //in forma poloneza postfixata entitatile sunt separate prin spatiu
    vf=0;             //varful stivei in care calculez valoarea expresiei
    while(p!=NULL)
    {
        if(*p=='+' || (*p=='-' && *(p+1)==0) ||*p=='*' || *p=='/')
         {
             if(*p=='+') R=S1[vf]+S1[vf-1];
             if(*p=='-') R=S1[vf-1]-S1[vf];
             if(*p=='*') R=S1[vf]*S1[vf-1];
             if(*p=='/') R=S1[vf-1]/S1[vf];
             vf--;
             S1[vf]=R;  //pun in stiva rezultatul operatiei
         }
           else
           {
               vf++;
               S1[vf]=atoi(p);  //pun in stiva operandul
           }
        p=strtok(NULL," ");
    }
    fprintf(g,"%d\n",S1[1]);  //afisez rezultatul
    fclose(f);
    fclose(g);
    return 0;

}