Cod sursa(job #1093766)

Utilizator Toast97Calin Farcas Toast97 Data 28 ianuarie 2014 16:17:30
Problema Evaluarea unei expresii Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 3.23 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

int e[100005], oper[100005], postfix[100005], ko=0, rez[100005], r=0, j;

char e1[100005];

const int MAX=1000000000;


bool operand(int x)
{
    if(x>MAX) return 1;
    return 0;
}

int numara(int x)
{
    int i, k=0;
    for(i=x-1;e[i]!=MAX+5;i--) if(!operand(e[i])) k++;
    return k;
}


void actualizeaza1()
{
    int i=1, q;

    while(!oper[i]) i++;

    q=i-1;

    for(i=i; oper[i]; i++)  {
            oper[i-q]=oper[i];
    }

   ko-=q;

}

void actualizeaza2(int x)
{
    int i, q=1;

    oper[x]=0;

    for(i=x; oper[i]!=MAX+6; i++, q++);

    oper[i]=0;

    i++;

    for(i=i; oper[i]; i++) oper[i-q]=oper[i];

    ko-=q;
}

int main()
{
    f.getline(e1, 100003);

    int l1=strlen(e1), i, kp=0, koc, l=0, nr;

    for(i=0;i<l1;i++) {
    if(e1[i]=='+') e[++l]=MAX+1;
    else if(e1[i]=='-') e[++l]=MAX+2;
    else if(e1[i]=='*') e[++l]=MAX+3;
    else if(e1[i]=='/') e[++l]=MAX+4;
    else if(e1[i]=='(') e[++l]=MAX+5;
    else if(e1[i]==')') e[++l]=MAX+6;
    else {
       nr=0;
     while(strchr("0123456789", e1[i]) && i<l1)  {
      nr*=10;
      nr+=e1[i]-48;
      i++;
      }
      i--;
      e[++l]=nr;
     }

    }


    for(i=1;i<=l;i++)  {
        if(operand(e[i]))  {
           oper[++ko]=e[i];
           if(oper[ko]==MAX+3 || oper[ko]==MAX+4)  {
               koc=ko-1;
               while((oper[koc]==MAX+3 || oper[koc]==MAX+4) && koc) {
                  postfix[++kp]=oper[koc];
                  oper[koc]=0;
                  koc--;
               }
               actualizeaza1();
           }

           else if(oper[ko]==MAX+1 || oper[ko]==MAX+2)  {
               koc=ko-1;
               while((oper[koc]==MAX+1 || oper[koc]==MAX+2 || oper[koc]==MAX+3 || oper[koc]==MAX+4) && koc) {
                  postfix[++kp]=oper[koc];
                  oper[koc]=0;
                  koc--;
               }
                actualizeaza1();
           }

           else if(oper[ko]==MAX+6)  {
               koc=ko;
               if(numara(i)==1) {
                   postfix[kp]*=(-1);
                   oper[ko-1]=0;
               }

               while(oper[--koc]!=MAX+5) {
                  if(oper[koc]) postfix[++kp]=oper[koc];
                  oper[koc]=0;
               }

             actualizeaza2(koc);
           }

        }

        else postfix[++kp]=e[i];

    }

    for(i=ko;i>=1;i--) if(oper[i]) postfix[++kp]=oper[i];

    for(i=1;i<=kp;i++)  rez[++r]=postfix[i];

    //for(i=1;i<=r;i++) g<<rez[i]<<" ";
    //g<<'\n';

    int a, b;

    for(i=1;i<=r;i++)  if(operand(rez[i])) {
        j=i;
        while(operand(rez[j]) || rez[j]==1111111111) j--;
        a=rez[j];
        rez[j]=1111111111;

        j--;

        while((operand(rez[j]) || rez[j]==1111111111) && j) j--;
        b=rez[j];
        rez[j]=1111111111;

        if(rez[i]==MAX+1) rez[i]=b+a;
        else if(rez[i]==MAX+2) rez[i]=b-a;
        else if(rez[i]==MAX+3) rez[i]=b*a;
        else if(rez[i]==MAX+4) rez[i]=b/a;
    }

    g<<rez[r];

    f.close();
    g.close();
    return 0;
}