Cod sursa(job #1050959)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 9 decembrie 2013 15:18:17
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

char s[100001], a[100001];
int b[100001], vf1, vf2, nr, ok, i, pr[256], n;
void calcul()
{
    char ch;
     int rez;
    ch=a[vf1];
    switch(ch)
    {
        case '+': rez=b[vf2-1]+b[vf2]; break;
        case '-': rez=b[vf2-1]-b[vf2]; break;
        case '*': rez=b[vf2-1]*b[vf2]; break;
        case '/': rez=b[vf2-1]/b[vf2]; break;
    }
    vf1--;
    vf2--;
    b[vf2]=rez;
}
int main()
{
    f>>s;
    n=strlen(s);
    pr['(']=1;
    pr['+']=pr['-']=2;
    pr['*']=pr['/']=3;
    for(i=0; i<n; i++)
    {
        if(s[i]=='(')
        {
            vf1++;
            a[vf1]='(';

        }
        else
        {
            if(s[i]==')')
            {
                if(ok==1)
                {
                    vf2++;
                    b[vf2]=nr;
                    nr=0;ok=0;

                }
                while(a[vf1]!='(')
                      calcul();
                vf1--;//elimin paranteza deschisa

            }

           else
            if(s[i]>='0' && s[i]<='9')
            {
                ok=1;
                nr=nr*10 + s[i] - '0';
            }
            else // am operator +-*/
            {
                if(ok==1)
                {
                    vf2++;
                    b[vf2]=nr;
                    nr=0;ok=0;
                }
                while(vf1>0&&pr[s[i]]<=pr[a[vf1]]){
                   calcul();
                }
              vf1++;a[vf1]=s[i];

            }
        }
    }
  if(ok==1)
   {
       vf2++;
       b[vf2]=nr;
   }
 while(vf1>0)
   calcul();
  g<<b[1];
    return 0;
}