Cod sursa(job #2034648)

Utilizator IsacLucianIsac Lucian IsacLucian Data 8 octombrie 2017 11:26:14
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <bits/stdc++.h>
#define inf (1<<30)

using namespace std;

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

char s[100002];
int st[100002];

int main()
{
    int i,top,var;
    fin>>s;
    top=0;
    for(i=0;s[i];)
    {
        if('0'<=s[i] && s[i]<='9')
        {
            var=0;
            while('0'<=s[i] && s[i]<='9')
            {
                var=var*10+s[i]-'0';
                i++;
            }
            if(top && st[top]==-inf)
            {
                top--;
                st[top]*=var;
            }
            else if(top && st[top]==inf+2)
            {
                top--;
                st[top]/=var;
            }
            else if(top && st[top]==inf+1)
            {
                top--;
                st[++top]=(-1*var);
            }
            else st[++top]=var;
        }
        else if(s[i]=='*')
        {
            st[++top]=-inf;
            i++;
        }
        else if(s[i]=='-')
        {
            st[++top]=inf+1;
            i++;
        }
        else if(s[i]=='/')
        {
            st[++top]=inf+2;
            i++;
        }
        else if(s[i]=='(')
        {
            st[++top]=inf;
            i++;
        }
        else if(s[i]=='+')i++;
        else
        {
            var=0;
            while(top && st[top]!=inf)
            {
                var+=st[top];
                top--;
            }
            top--;
            if(top && st[top]==-inf)
            {
                top--;
                st[top]*=var;
            }
            else if(top && st[top]==inf+2)
            {
                top--;
                st[top]/=var;
            }
            else if(top && st[top]==inf+1)
            {
                top--;
                st[++top]=(-1*var);
            }
            else st[++top]=var;
            i++;
        }
    }

    var=0;
    while(top>0)
    {
        var+=st[top];
        top--;
    }
    fout<<var;
    return 0;
}