Cod sursa(job #1871728)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 7 februarie 2017 17:01:14
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include<cstdio>
#include<cstring>
int polo[100000];
char op[100000];
char s[100000];
int priority(char a)
{
    if(a=='*'||a=='/')
        return 2;
    if(a=='-'||a=='+')
        return 1;
    return -1;
}
int main()
{
    int i,j,n,poz,cpoz,p,nr,ccpoz;
    char c;
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);
    i=0;
    j=0;
    gets(s+1);
    n=strlen(s+1);
    poz=1;
    while(poz<=n)
    {
        nr=0;
        if(s[poz]-'0'>=0&&s[poz]-'0'<=9)
        {
            cpoz=poz;
            p=1;
            while(s[cpoz]-'0'>=0&&s[cpoz]-'0'<=9)
            {
                cpoz++;
                p*=10;
            }
            p/=10;
            ccpoz=cpoz-1;
            cpoz=poz;
            poz=ccpoz;
            while(p>=1)
            {
                nr=nr+(s[cpoz]-'0')*p;
                p/=10;
                cpoz++;
            }
        j++;
            polo[j]=nr;

        }
        else
        {
            if(i==0||op[i]=='('||priority(s[poz])>priority(op[i])||s[poz]=='(')
            {
                i++;
                op[i]=s[poz];
            }

            else
            {
                if(s[poz]==')')
                {
                    while(op[i]!='(')
                    {
                        j++;
                        polo[j]=op[i];
                        i--;
                    }
                    i--;
                }
                else if(priority(s[poz])<=priority(op[i]))
                {
                    while(op[i]!='('&&i>=1)
                    {
                        j++;
                        polo[j]=op[i];
                        i--;
                    }
                        i++;
                    op[i]=s[poz];
                }
                if(polo[j]=='-')
                    polo[j-2]=polo[j-2]-polo[j-1];
                if(polo[j]=='+')
                    polo[j-2]=polo[j-2]+polo[j-1];
                if(polo[j]=='*')
                    polo[j-2]=polo[j-2]*polo[j-1];
                if(polo[j]=='/')
                    polo[j-2]=polo[j-2]/polo[j-1];
                j-=2;
            }
        }
        poz++;
    }
    while(j>1){
    if(i>0)
    {
        j++;
        polo[j]=op[i];
        i--;
    }
    if(polo[j]=='-')
                    polo[j-2]=polo[j-2]-polo[j-1];
                if(polo[j]=='+')
                    polo[j-2]=polo[j-2]+polo[j-1];
                if(polo[j]=='*')
                    polo[j-2]=polo[j-2]*polo[j-1];
                if(polo[j]=='/')
                    polo[j-2]=polo[j-2]/polo[j-1];
                j-=2;
    }
    printf("%d",polo[1]);
}