Cod sursa(job #1793358)

Utilizator tanasaradutanasaradu tanasaradu Data 30 octombrie 2016 22:42:20
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.62 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,x;
    fin>>a;
    semn=1;
    top=0;
    for(i=0;a[i]!=0;)
    {
        if(a[i]=='-' and a[i+1]!='(')
        {
            semn=-1;
            i++;
        }
        else if(a[i]=='-' and a[i+1]=='(')
        {
            semn=-2;
            i++;
        }
        else 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('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(semn==-1)
            {
                numar=numar*semn;
                semn=1;
            }
            while(top>0 and st[top]==infinit1)
            {
                top--;
                gata=1;
                numar*=st[top];
            }
            while(top>0 and st[top]==infinit2)
            {
                top--;
                numar=st[top]/numar;
                gata=1;
            }
            if(gata==1)
            st[top]=numar;
            else st[++top]=numar;
        }
        else if(a[i]==')')
        {
            numar=0;
            gata=0;
            while(st[top]!=infinit)
            {
               numar+=st[top];
               top--;
            }
            if(semn==-2)
            {
                numar*=-1;
                semn=1;
            }
            while(top>0 and st[top]==infinit1)
            {
                top--;
                numar*=st[top];
                gata=1;
            }
              while(top>0 and st[top]==infinit2)
            {
                top--;
                gata=1;
                numar=st[top]/numar;
            }
            if(gata==1)
            st[top]=numar;
            else st[++top]=numar;
            i++;
        }
    }
    x=0;
    for(i=1;i<=top;i++)
      if(st[i]!=infinit and st[i]!=infinit1 and st[i]!=infinit2)
        x+=st[i];
      fout<<x<<"\n";
}
int main()
{
    Rezolvare();
    return 0;
}