Cod sursa(job #3167119)

Utilizator CraiuAndreiCraiu Andrei David CraiuAndrei Data 10 noiembrie 2023 00:05:29
Problema Evaluarea unei expresii Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.57 kb
#include <bits/stdc++.h>
#define plus 1000000000
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

char s[1000005];
long long st[1000005],top,ok,n;

int main()
{
    long long i,j,jj,k,x,y;
    fin>>s;
    n=strlen(s)-1;
    s[-1]='(';
    s[n+1]=')';
    for(i=-1;s[i]!=NULL;)
    {
        if(s[i]>='0' && s[i]<='9')
        {
            x=0;
            while(s[i]>='0' && s[i]<='9')
            {
                x=x*10+(s[i]-'0');
                i++;
            }
            st[top++]=x;
        }
        else if(s[i]=='(')
        {
            st[top++]=-1;
            i++;
        }
        else if(s[i]=='+')
        {
            st[top++]=-2;
            i++;
        }
        else if(s[i]=='-')
        {
            st[top++]=-3;
            i++;
        }
        else if(s[i]=='*')
        {
            st[top++]=-4;
            i++;
        }
        else if(s[i]=='/')
        {
            st[top++]=-5;
            i++;
        }
        else
        {
            i++;
            for(j=top;st[j]!=-1;j--);
            k=j;
            x=st[j+1];
            j+=2;
            while(j<top)
            {
                if((st[j]==-4 || st[j]==-5) && j<top)
                {
                    while((st[j]==-4 || st[j]==-5) && j<top)
                    {
                        if(st[j]==-4)x*=st[j+1];
                        else if(st[j]==-5)x/=st[j+1];
                        j+=2;
                    }
                }
                if((st[j]==-2 || st[j]==-3) && (st[j+2]==-4 || st[j+2]==-5) && j<top)
                {
                    y=st[j+1];
                    jj=j;
                    j+=2;
                    while((st[j]==-4 || st[j]==-5) && j<top)
                    {
                        if(st[j]==-4)y*=st[j+1];
                        else if(st[j]==-5)y/=st[j+1];
                        j+=2;
                    }
                    if(st[jj]==-2)x+=y;
                    else if(st[jj]==-3)x-=y;
                }
                else if(((st[j]==-2 || st[j]==-3) && (st[j+2]!=-4 || st[j+2]!=-5)) && j<top)
                {
                    while((st[j]==-2 || st[j]==-3) && (st[j+2]!=-4 || st[j+2]!=-5) && j<top)
                    {
                        if(st[j]==-2)x+=st[j+1];
                        else if(st[j]==-3)x-=st[j+1];
                        j+=2;
                    }
                }
            }
            st[k++]=x;
            top=k;
        }
    }
    fout<<st[0]<<" ";
    return 0;
}