Cod sursa(job #1857202)

Utilizator tanasaradutanasaradu tanasaradu Data 25 ianuarie 2017 21:57:05
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <bits/stdc++.h>
#define infinit 100000000
#define infinit1 -100000000
#define infinit2 100000001
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
///infinit=(
///infinit1=*
///infinit2=/
int st[100005],top;
char a[100005];
void Rezolvare()
{
    int i,semn,numar,gata,aux=0;
    fin>>a;
    semn=1;
    top=0;
    for(i=0;a[i]!=0;)
    {
        if(a[i]=='+')
            i++;
        else if(a[i]=='(')
        {
            st[++top]=infinit;
            i++;
        }
        else if(a[i]=='*')
        {
            st[++top]=infinit1;
            i++;
        }
        else if(a[i]=='/')
        {
            st[++top]=infinit2;
            i++;
        }
        else if(a[i]=='-')
        {
            st[++top]=-111111111;
            i++;
        }
        else if('0'<=a[i] and a[i]<='9')
        {
            numar=0;
            gata=0;
            while('0'<=a[i] and a[i]<='9')
            {
                numar=numar*10+a[i]-'0';
                i++;
            }
            if(st[top]==-111111111)
            {
                numar*=-1;
                top--;
            }
            while(top>0 and st[top]==infinit1)
            {
                top--;
                gata=1;
                numar*=st[top];
                top--;
            }
            while(top>0 and st[top]==infinit2)
            {
                top--;
                numar=st[top]/numar;
                top--;
            }
            st[++top]=numar;
        }
        else if(a[i]==')')
        {
            numar=0;
            while(st[top]!=infinit && top>0)
            {
               numar+=st[top];
               top--;
            }
            top--;
            while(top>0 && st[top]==infinit1)
            {
                top--;
                numar*=st[top];
                top--;
            }
            while(top>0 && st[top]==infinit2)
            {
                top--;
                numar=st[top]/numar;
                top--;
            }
              if(st[top]==-111111111)
            {
                numar*=-1;
                top--;
            }
            st[++top]=numar;
            i++;
        }
    }
    numar=0;
    for(i=1;i<=top;i++)
        numar+=st[i];
    fout<<numar<<"\n";
}
int main()
{
    Rezolvare();
    return 0;
}