Cod sursa(job #1769486)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 2 octombrie 2016 16:52:00
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
#include <cstdio>
#include <cstring>

using namespace std;




char sir[100001];
int v[100001],stiv[10000],f,l=-1;
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    scanf("%s",&sir);
    int n=strlen(sir),i,rad=0,x=0,k=0,a;

    for(i=0; i<n; i++)
    {
        if(sir[i]>='0'&&sir[i]<='9')
        {


            while(sir[i]>='0'&&sir[i]<='9')
            {
                x=x*10+sir[i]-'0';
                i++;

            }i--;
            v[k++]=x*10;
            x=0;
        }
        else if(sir[i]=='(')
        {
            stiv[++l]='(';
        }
        else if(sir[i]==')')
        {
            while(l>=0&&stiv[l]!='(')
            {
                v[k++]=stiv[l]*10+1;
                l--;
            }
            l--;

        }
        else if(sir[i]=='+')
        {
            while(l>=0&&stiv[l]!='(')
            {
                v[k++]=stiv[l]*10+1;
                l--;
            }
            stiv[++l]='+';

        }
        else if(sir[i]=='-')
        {
            while(l>=0&&stiv[l]!='(')
            {
                v[k++]=stiv[l]*10+1;
                l--;
            }
            stiv[++l]='-';
        }
        else if(sir[i]=='*')
        {


            while((l>=0)&&(stiv[l]!='+'&&stiv[l]!='-'&&stiv[l]!='('))
            {
                v[k++]=stiv[l]*10+1;l--;
            }

            stiv[++l]='*';

        }
        else if(sir[i]=='/')
        {
            while(l>=0&&(stiv[l]!='+'&&stiv[l]!='-'&&stiv[l]!='('))
            {
                v[k++]=stiv[l]*10+1;l--;
            }
            stiv[++l]='/';
        }
    }
    while(l>=0)
    {
        v[k++]=stiv[l]*10+1;
        l--;
    }
/*
    for(i=0;i<k;i++)
    {   if(v[i]%10==0)
        printf("%d ",v[i]/10);
        else if(v[i]/10=='+')printf("+ ");
        else  if(v[i]/10=='-')printf("- ");
         else if(v[i]/10=='*')printf("* ");
          else if(v[i]/10=='/')printf("/ ");
    }
    */
    f=-1;
    for(i=0;i<k;i++)
    {
        if(v[i]%10==0)stiv[++f]=v[i]/10;
        else
            {
               if(v[i]/10=='+'){stiv[f-1]+=stiv[f];f--;}
        else  if(v[i]/10=='-'){stiv[f-1]-=stiv[f];f--;}
         else if(v[i]/10=='*'){stiv[f-1]*=stiv[f];f--;}
          else if(v[i]/10=='/'){stiv[f-1]/=stiv[f];f--;}

            }
    }
    printf("%d ", stiv[f]);




    return 0;
}