Cod sursa(job #1882992)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 17 februarie 2017 17:24:51
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 3.14 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||priority(s[poz])>priority(op[i])||s[poz]=='(')
            {
                i++;
                op[i]=s[poz];
            }
            else if(op[i]=='('&&s[poz]==')')
                i--;

            else
            {   if(s[poz]==')'&&op[i]=='('){
                        i--;
                        polo[++j]=op[i];
            }
                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];
                    j-=2;
                    }
                else if(polo[j]=='+'){
                    polo[j-2]=polo[j-2]+polo[j-1];
                    j-=2;}
                else if(polo[j]=='*'){
                    polo[j-2]=polo[j-2]*polo[j-1];
                    j-=2;}
                else 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];
                    j-=2;
                    }
                else if(polo[j]=='+'){
                    polo[j-2]=polo[j-2]+polo[j-1];
                    j-=2;}
                else if(polo[j]=='*'){
                    polo[j-2]=polo[j-2]*polo[j-1];
                    j-=2;}
                else if(polo[j]=='/'){
                    polo[j-2]=polo[j-2]/polo[j-1];
                    j-=2;}
    }
    printf("%d",polo[1]);
}