Cod sursa(job #1570178)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 16 ianuarie 2016 11:29:27
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#define MAX 1000000000
#define N 100004
#include <cstring>
#include <vector>
using namespace std;

int S[N],one,two,n,i,nr,s;
char a[N];
vector<int> post;
int sign[250];

bool digit(char x)
{
    if(x>'9') return 0;
    if(x<'0') return 0;
    return 1;
}

int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);

    gets(a+1);
    n=strlen(a+1);
    a[n+1]=')';
    a[0]='(';
    ++n;++n;

    sign['+']=MAX+1;
    sign['-']=MAX+2;
    sign['*']=MAX+3;
    sign['(']=MAX+4;
    sign[')']=MAX+5;
    sign['/']=MAX+6;

    int rang[]={0,2,2,3,4,1,3};

    for(i=0;i<n;++i)
    {
         if(digit(a[i]))
         {
             nr=0;
             while(i<n && digit(a[i]))
             {
                nr=nr*10+a[i]-'0';
                ++i;
             }
             post.push_back(nr);
             --i;
         }
         else
         {
              while(i<n && s && rang[sign[a[i]]-MAX]<=rang[S[s]-MAX] && S[s]!=sign['('])
                     post.push_back(S[s]), --s;
              if(s && S[s]==sign['('] && a[i]==')') --s;
              else
              S[++s]=sign[a[i]];
         }
    }

    s=0;
    for(i=0;i<post.size();++i)
    {
        if(post[i]>MAX)
        {
            one=S[s-1];
            two=S[s];
            --s;
            if(post[i]==sign['-']) S[s]=one-two;
            else if(post[i]==sign['+']) S[s]=one+two;
            else if(post[i]==sign['*']) S[s]=one*two;
            else S[s]=one/two;
        }
        else S[++s]=post[i];
    }
    printf("%d\n",S[1]);

    return 0;
}