Cod sursa(job #1914962)

Utilizator tanasaradutanasaradu tanasaradu Data 8 martie 2017 19:08:46
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>
#define nmax 100005
#define infinit 1000000001
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char a[nmax];
int top,st[nmax];
///(=-infinit
///*=infinit
///infinit+1=/
///infinit+2=-
inline bool Numar(char c)
{
    if('0'<=c && c<='9')
        return  true;
    return false;
}
inline void Evaluare()
{
    int i,numar;
    for(i=0;a[i];)
    {
        if(a[i]=='+')
            i++;
        else if(a[i]=='-')
        {
            st[++top]=(infinit+2);
            i++;
        }
        else if(a[i]=='(')
        {
            st[++top]=-infinit;
            i++;
        }
        else if(a[i]=='*')
        {
            st[++top]=infinit;
            i++;
        }
        else if(a[i]=='/')
        {
            st[++top]=infinit+1;
            i++;
        }
        else if(Numar(a[i]))
        {
            numar=0;
            while(Numar(a[i]))
            {
                numar=numar*10+(a[i]-'0');
                i++;
            }
            while(st[top]==infinit)
            {
                numar*=st[top-1];
                top-=2;
            }
            while(st[top]==(infinit+1))
            {
                numar=st[top-1]/numar;
                top-=2;
            }
            if(st[top]==(infinit+2))
            {
                numar*=(-1);
                top--;
            }
            st[++top]=numar;
        }
        else
        {
            numar=0;
            while(st[top]!=-infinit)
            {
                numar+=st[top];
                top--;
            }
            top--;
             while(st[top]==infinit)
            {
                numar*=st[top-1];
                top-=2;
            }
            while(st[top]==(infinit+1))
            {
                numar=st[top-1]/numar;
                top-=2;
            }
            if(st[top]==(infinit+2))
            {
                numar*=(-1);
                top--;
            }
            st[++top]=numar;
            i++;
        }
    }
    numar=0;
    for(i=1;i<=top;i++)
        numar+=st[i];
        fout<<numar<<"\n";
}
int main()
{
    fin>>a;
    Evaluare();
    return 0;
}