Cod sursa(job #2698929)

Utilizator Catalinu23Gavrila Catalin Catalinu23 Data 23 ianuarie 2021 11:37:53
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.89 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

int st[NMAX];
char c[NMAX];

// notatii:
// '+' = -2
// '-' = -3
// '*' = -4
// '/' = -5
// nimic = -6

int main()
{
    int top=0,val=-1,i,j,p,x;
    fin>>c;
    for(i=0;c[i];i++)
    {
        char ch=c[i];
        if(ch=='(')
            st[++top]=-1;
        else if(ch=='+')
        {
            if(val>=0)
                st[++top]=val, val=-1;
            st[++top]=-2;
        }
        else if(ch=='-')
        {
            if(val>=0)
                st[++top]=val, val=-1;
            st[++top]=-3;
        }
        else if(ch=='*')
        {
            if(val>=0)
                st[++top]=val, val=-1;
            st[++top]=-4;
        }
        else if(ch=='/')
        {
            if(val>=0)
                st[++top]=val, val=-1;
            st[++top]=-5;
        }
        else if(isdigit(ch))
            if(val==-1)
                val=ch-'0';
            else
                val=val*10+(ch-'0');
        else if(ch==')')
        {
            if(val>=0)
                st[++top]=val, val=-1;
            for(j=top;st[j]!=-1;j--)
                ;
            x=st[j+1];
            for(p=j+3;p<=top;p+=2)
            {
                if(st[p+1]==-4||st[p+1]==-5)
                {
                    int rez=st[p];
                    for(int k=p+1;k<=top;k+=2)
                    {
                        if(st[k]==-4)
                            rez*=st[k+1];
                        else if(st[k]==-5)
                            rez/=st[k+1];
                        else
                            break;
                        st[k]=st[k+1]=-6;
                    }
                    st[p]=rez;
                }
                if(st[p-1]==-2&&st[p]!=-6)
                    x+=st[p];
                else if(st[p-1]==-3&&st[p]!=-6)
                    x-=st[p];
            }
            top=j;
            st[top]=x;
        }
    }
    if(val>=0) st[++top]=val;
    /*for(int i=1;i<=top;i++)
        if(st[i]!=-6)
            cout<<st[i]<<" ";*/
    x=0;
    for(i=1;i<=top;i+=2)
    {
        if(st[i+1]==-4||st[i+1]==-5)
        {
            int rez=st[i];
            for(int k=i+1;k<=top;k+=2)
            {
                if(st[k]==-4)
                    rez*=st[k+1];
                else if(st[k]==-5)
                    rez/=st[k+1];
                else
                    break;
                st[k]=st[k+1]=-6;
            }
            //cout<<i<<" "<<rez<<" ";
            st[i]=rez;
            //cout<<i<<" "<<st[i]<<"\n";
        }
    }
    x=st[1];
    for(int i=3;i<=top;i+=2)
    {
        if(st[i-1]==-2&&st[i]!=-6)
            x+=st[i];
        else if(st[i-1]==-3&&st[i]!=-6)
            x-=st[i];
    }

    fout<<x;
    return 0;
}