Cod sursa(job #1280377)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 1 decembrie 2014 21:23:15
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.62 kb
#include <stdio.h>
#include <list>
FILE *fin, *fout;
std::list<long> num;
std::list<char> op;
bool ver(char ch1,char ch2)
{
     if(ch1=='*'||ch1=='/') return 1;
     if(ch1=='+'||ch1=='-')
     {
                           if(ch2!='*'&&ch2!='/') return 1;
     }
     return 0;
}
int main()
{
    fin = fopen("evaluare.in","r");
    fout = fopen("evaluare.out", "w");
    char ch;
    long nr;
    while(!feof(fin))
    {
                     fscanf(fin,"%c",&ch);
                     if('0'<=ch&&ch<='9')
                     {
                                         nr=0;
                                         do
                                         {
                                              nr*=10;
                                              nr+=(ch-'0');
                                              fscanf(fin,"%c",&ch);
                                              if(feof(fin)) break;
                                         }while('0'<=ch&&ch<='9');
                                         num.push_back(nr);
                     }
                     if(feof(fin)) break;
                     if(ch==')')
                     {
                                while(1)
                                {
                                    if(op.back()=='(')
                                    {
                                                      op.pop_back();
                                                      break;
                                    }
                                    else
                                    {
                                        if(op.back()=='+') num.push_back(-1);
                                        else if(op.back()=='-') num.push_back(-2);
                                        else if(op.back()=='*') num.push_back(-3);
                                        else num.push_back(-4);
                                        op.pop_back();
                                    }
                                }
                     }
                     else
                     {
                         while(ver(op.back(),ch)==1)
                         {
                                  if(op.back()=='+') num.push_back(-1);
                                  else if(op.back()=='-') num.push_back(-2);
                                  else if(op.back()=='*') num.push_back(-3);
                                  else num.push_back(-4);
                                  op.pop_back();
                         }
                         op.push_back(ch);
                     }
    }
    while(!op.empty())
    {
                                  if(op.back()=='+') num.push_back(-1);
                                  else if(op.back()=='-') num.push_back(-2);
                                  else if(op.back()=='*') num.push_back(-3);
                                  else num.push_back(-4);
                                  op.pop_back();
    }
    std::list<long>::iterator i;
    std::list<long> rezultat;
    int nr1,nr2,nr3;
    while(!num.empty())
    {
        nr1=num.front();
        num.pop_front();
        if(nr1<0)
        {
            nr2=rezultat.back();
            rezultat.pop_back();
            nr3=rezultat.back();
            rezultat.pop_back();
            if(nr1==-1) rezultat.push_back(nr2+nr3);
            else if(nr1==-2) rezultat.push_back(nr2-nr3);
            else if(nr1==-3) rezultat.push_back(nr2*nr3);
            else if(nr1==-4) rezultat.push_back(nr2/nr3);
        }
        else rezultat.push_back(nr1);
    }
    fprintf(fout,"%ld",rezultat.front());
}