Cod sursa(job #1872003)

Utilizator patrickdanDan patrick patrickdan Data 7 februarie 2017 21:04:05
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include <cstdio>
#include<cstring>
using namespace std;
char polo[105];
char op[105];
char s[105];
int import[255];
int numere[105];
int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    int n,i,nr,nr2,j,a1,a2,aux,si,a3,nr1,poz2,poz;
    gets(s);
    n=strlen(s);
    nr=0;
    nr2=0;
    import['*']=import['/']=2;
    import['+']=import['-']=1;
    for(i=0;i<n;i++)
    {
        if(s[i]>='0' && s[i]<='9'){
            j=i;
            nr1=0;
            while(s[j]>='0' && s[j]<='9'){
                nr1=nr1*10+(s[j]-'0');
                j++;
            }
            j--;
            i=j;
            polo[++nr]=-2;
            numere[nr]=nr1;
        }
        else
            {
                if(s[i]==')')
                {
                    j=nr2;
                    while(op[j]!='(' && j>=1)
                    {
                        polo[++nr]=op[j];
                        op[j]=0;
                        j--;
                        nr2--;
                    }
                    op[j]=0;
                }
                else
                if(import[s[i]]>import[op[nr2]] || op[nr2]=='(' || op[nr2]==')' || s[i]=='(')
                  op[++nr2]=s[i];

                else
                {
                    j=nr2;
                    while(import[s[i]]<import[op[nr2]] && j>=1)
                    {
                        polo[++nr]=op[j];
                        op[j]=0;
                        j--;
                        nr2--;
                    }
                    op[j]=s[i];
                }

            }
    }
    if(nr2!=0)
        for(i=nr2;i>=0;i--)
          polo[++nr]=op[i];
    a1=a2=aux=si=0;
    for(i=1;i<=nr;i++)
    {
        j=i;
        while((polo[j]==-2 || polo[j]==0) && j<=nr)
            j++;
        a1=polo[j];
        poz2=j;
        while(numere[j]==0 && j>=1)
            j--;
        a2=numere[j];
        poz=j;
        a3=numere[j-1];
        if(a1=='+')
            si=a2+a3;
        if(a1=='/')
            si=a3/a2;
        if(a1=='*')
            si=a2*a3;
        if(a1=='-')
            si=a3-a2;
        if(numere[poz+2]!=0){
          numere[poz+1]=si;
          numere[poz-1]=numere[poz]=0;
          polo[poz+1]=0;
        }
        else{
            numere[i]=si;
            polo[poz2]=0;
            numere[poz]=0;
        }
        i=poz+1;
        if(sizeof(polo)==0)
            break;
    }
    for(i=nr;i>=1;i--)
        if(numere[i]!=0)
    {
        printf("%d",numere[i]);
        break;
    }
    return 0;
}