Cod sursa(job #2573011)

Utilizator vnbnghpdifjngfojNecsulea Stefan vnbnghpdifjngfoj Data 5 martie 2020 15:22:36
Problema Evaluarea unei expresii Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.98 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char a[1000001];
long long k, q, fp[100001], st[100001] ;
int main()
{
    fin>>a;
    for(int i=0; i<strlen(a); i++)
    {
        if(a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]=='/' || a[i]=='(')
        {
            if((a[i]=='*' || a[i]=='/') && (st[k]==-3 || st[k]==-4 ))
            {
                while(st[k]==-3 || st[k]==-4 && k!=0)
                    {if(st[k]==-3)
                        fp[++q]=-3;
                    else
                        fp[++q]=-4;
                    k--;
                    }
                  if(a[i]=='*')
                    st[++k]=-3;
                  else
                    st[++k]=-4;
            }
            if((a[i]=='*' || a[i]=='/') && (st[k]==-1 || st[k]==-2 || st[k]==-5 || k==0) )
                    {
                if(a[i]=='*')
                    st[++k]=-3;
                else
                    st[++k]=-4;
                    }

            if(a[i]=='(')
                st[++k]=-5;

            if((a[i]=='+' || a[i]=='-') && st[k]!=-5 && k!=0)
            {
                while(st[k]!=-5 && k!=0)
                {
                    if(st[k]==-3)
                    fp[++q]=-3;
                else
                    {if(st[k]==-1)
                        fp[++q]=-1;
                    else
                       {if(st[k]==-2)
                            fp[++q]=-2;
                        else
                            if(st[k]==-4)
                                fp[++q]=-4;
                          }


                           }
                           k--;
                }
                if(a[i]=='+')
                    st[++k]=-1;
                else
                    st[++k]=-2;

            }
            if((a[i]=='+' || a[i]=='-')  && (st[k]==-5 || k==0))
                {if(a[i]=='+')
                   st[++k]=-1;
                else
                    st[++k]=-2;
                }



        }
        else
        {
            if(a[i]==')')
        {
            while(st[k]!=-5)
            {
                 if(st[k]==-3)
                    fp[++q]=-3;

                else
                    {if(st[k]==-1)
                        fp[++q]=-1;
                    else
                       {if(st[k]==-2)
                            fp[++q]=-2;
                        else
                            if(st[k]==-4)
                                fp[++q]=-4;

                       }
                            }
                k--;
            }
            k--;
        }
            else
                {if(a[i-1]<48 && i>0)
                    fp[++q]=a[i]-48;
                else
                    fp[q]=fp[q]*10 +(a[i]-48);
                }


        }

    }

    while(k!=0)
    {
                if(st[k]==-3)
                    {fp[++q]=-3;
                    k--;
                    }
                else
                    {if(st[k]==-1)
                        fp[++q]=-1;
                    else
                       {if(st[k]==-2)
                            fp[++q]=-2;
                        else
                            if(st[k]==-4)
                                fp[++q]=-4;

                       }

                k--;}
    }
    for(int i=1; i<=q; i++)
    {
    if(fp[i]<0)
    {
        if(fp[i]==-1)
            fp[i]=fp[i-2]+fp[i-1];
        else
            {if(fp[i]==-2)
                fp[i]=fp[i-2]-fp[i-1];
            else
                {if(fp[i]==-3)
                    fp[i]=fp[i-2]*fp[i-1];
                else
                    fp[i]=fp[i-2]/fp[i-1];}
                    }

        int y=i;
        for(int d=i-3; d>=1 && y>1; d--, y--)
        {
            fp[y-1]=fp[d];
        }
    if(i!=q)
      i=i-2;


    }



    }

fout<<fp[q];

    return 0;
}