Cod sursa(job #2480314)

Utilizator STEFAN18Miclaus Stefan STEFAN18 Data 25 octombrie 2019 11:59:19
Problema Evaluarea unei expresii Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.21 kb
#include <stdio.h>
#include <cstring>

using namespace std;

char s[100001];

int rez[100001],st[100001];

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    int n,i,nr,k=0,t=0,a,b;
    scanf("%s",(s+1));
    n=strlen(s+1);
    for(i=1;i<=n;i++)
    {
        if(s[i]>='0' && s[i]<='9')
        {
            nr=(s[i]-'0');
            i++;
            while(s[i]>='0' && s[i]<='9')
            {
                nr*=10;
                nr+=(s[i]-'0');
                i++;
            }
            i--;
            k++;
            rez[k]=nr;
        }
        else
        {
            if(s[i]=='+')
            {
                if(st[t]==-6 || st[t]==-5 || st[t]==-4 || st[t]==-3)
                {
                    k++;
                    rez[k]=st[t];
                    st[t]=-5;
                }
                else
                {
                    t++;
                    st[t]=-5;
                }
            }
            else
            {
                if(s[i]=='-')
                {
                    if(st[t]==-6 || st[t]==-5 || st[t]==-4 || st[t]==-3)
                    {
                        k++;
                        rez[k]=st[t];
                        st[t]=-6;
                    }
                    else
                    {
                        t++;
                        st[t]=-6;
                    }
                }
                else
                {
                    if(s[i]=='*')
                    {
                        if(st[t]==-4 || st[t]==-3)
                        {
                            k++;
                            rez[k]=st[t];
                            st[t]=-3;
                        }
                        else
                        {
                            t++;
                            st[t]=-3;
                        }
                    }
                    else
                    {
                        if(s[i]=='/')
                        {
                            if(st[t]==-4 || st[t]==-3)
                            {
                                k++;
                                rez[k]=st[t];
                                st[t]=-4;
                            }
                            else
                            {
                                t++;
                                st[t]=-4;
                            }
                        }
                        else
                        {
                            if(s[i]=='(')
                            {
                                t++;
                                st[t]=-1;
                            }
                            else
                            {
                                if(s[i]==')')
                                {
                                    while(st[t]!=-1)
                                    {
                                        k++;
                                        rez[k]=st[t];
                                        t--;
                                    }
                                    t--;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    for(i=t;i>=1;i--)
    {
        k++;
        rez[k]=st[i];
    }
    t=0;
    for(i=1;i<=k;i++)
    {
        if(rez[i]>=0)
        {
            t++;
            st[t]=rez[i];
        }
        else
        {
            a=st[t-1];
            b=st[t];
            t--;
            if(rez[i]==-6)
            {
                st[t]=a-b;
            }
            else
            {
                if(rez[i]==-5)
                {
                    st[t]=a+b;
                }
                else
                {
                    if(rez[i]==-4)
                    {
                        st[t]=a/b;
                    }
                    else
                    {
                        st[t]=a*b;
                    }
                }
            }
        }
    }
    printf("%d",st[1]);

    return 0;
}