Cod sursa(job #1637647)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 7 martie 2016 18:30:29
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.52 kb
#include <fstream>
#include <stack>
#define pl 1000000001
#define mn 1000000002
#define inm 1000000003
#define imp 1000000004
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[100005];
int a[100005],n;

int P(char c)
     {if(c=='+'||c=='-')return 0;
         else if(c=='*'||c=='/') return 1;
         else if(c=='(')return -1;
     }

void Poloneza()
{stack <char> ST;
 int i,nr;
 char c;
 for(i=0;s[i]!=0;i++)
    {if(s[i]=='(')ST.push(s[i]);
     if(s[i]>='0'&&s[i]<='9')
       {nr=0;
        while(s[i]>='0'&&s[i]<='9')
             {nr=nr*10+s[i]-'0';
              i++;
             }
        i--;a[n]=nr;n++;
       }
     if(s[i]==')')
       {while(ST.size()>0&&ST.top()!='(')
             {c=ST.top();
              if(c=='+')a[n++]=pl;
              else if(c=='-')a[n++]=mn;
              else if(c=='*')a[n++]=inm;
              else if(c=='/')a[n++]=imp;
              ST.pop();
             }
        ST.pop();
       }
     if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')
       {if(ST.size()==0)ST.push(s[i]);
        else if(ST.top()=='(')ST.push(s[i]);
        else  {while(ST.size()>0&&ST.top()!='('&&P(s[i])<=P(ST.top())) {c=ST.top();
                                                         if(c=='+')a[n++]=pl;
                                                         else if(c=='-')a[n++]=mn;
                                                         else if(c=='*')a[n++]=inm;
                                                         else if(c=='/')a[n++]=imp;
                                                         ST.pop();
                                                        }
               ST.push(s[i]);
              }
       }
    }
     while(ST.size()>0){
                        c=ST.top();
                        if(c=='+')a[n++]=pl;
                        else if(c=='-')a[n++]=mn;
                        else if(c=='*')a[n++]=inm;
                        else if(c=='/')a[n++]=imp;
                        ST.pop();
                       }
  }
int Evaluare()
{stack <int>ST;
 int x,y,v,i;
 for(i=0;i<n;i++)
    {//fout<<a[i]<<" ";
     if(a[i]<pl) ST.push(a[i]);
      else{x=ST.top();ST.pop();
           y=ST.top();ST.pop();
           if(a[i]==pl)v=x+y;
           if(a[i]==mn)v=y-x;
           if(a[i]==inm)v=y*x;
           if(a[i]==imp)
             if(x!=0)v=y/x;
             else v=0;
          ST.push(v);
          }
    }
 return ST.top();
}
int main()
{fin>>s;
 Poloneza();
 fout<<Evaluare();
}