Cod sursa(job #715361)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 17 martie 2012 02:09:24
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.57 kb
                                                     
#include <fstream>
#include <stack>
using namespace std;

char sir[100005];
char post[200005];

long citestenumar(char *&s)
{
 long res = 0;
 long t;
 while (((unsigned)(t = (*s - '0'))) < 10)
  {
   res *= 10;
   res += t;
   s += 1;
  }
 return res;
}

void copiazanumar(char *&dest,char *&src)
{
 long t;
 while (((unsigned long)(t = (*src - '0'))) < 10)
  {
   *dest = *src;
   src += 1;
   dest += 1;
  }
}

long pri(char op)
{
 if (op == '+')
   {
    return 1;
   }
 if (op == '-')
   {
    return 1;
   }
 if (op == '*')
   {
    return 2;
   }
 if (op == '/')
   {
    return 2;
   }
 return 0;
}

void pfx(void)
{
 stack<char> S;
 char *p = sir;
 char *f = post;
 while (*p != 0)
  {
   if ((pri(*p) == 0) && (*p != '(') && (*p != ')'))
     {
      copiazanumar(f,p);
      *f = ' ';
      f += 1;
     }
    else
     {
      if ((*p != '(') && (*p != ')'))
        {
         while ((S.empty() == 0) && (pri(S.top()) >= pri(*p)))
          {
           *f = S.top();
           f += 1;
           S.pop();
          }
         S.push(*p);
         p += 1;
        }
      if (*p == '(')
        {
         S.push('(');
         p += 1;
        }
      if (*p == ')')
        {
         while (S.top() != '(')
          {
           *f = S.top();
           f += 1;
           S.pop();
          }
         S.pop();
         p += 1;
        }
     }
  }
 while (S.empty() == 0)
  {
   *f = S.top();
   S.pop();
   f += 1;
  }
}

long eval(void)
{
 stack<long> S;
 char *p = post;
 while (*p != 0)
  {
   if (('0' <= (*p)) && ((*p) <= '9'))
     {
      S.push(citestenumar(p));
     }
    else
     {
      if (*p == ' ')
        {
         p += 1;
         continue;
        }
      long V1,V2,V3;
      V2 = S.top(); S.pop();
      V1 = S.top(); S.pop();
      switch (*p)
       {
        case '+' :
          {
           V3 = V1 + V2;
          }
         break;
        case '-' :
          {
           V3 = V1 - V2;
          }
         break;
        case '*' :
          {
           V3 = V1 * V2;
          }
         break;
        case '/' :
          {
           V3 = V1 / V2;
          }
         break;
       };
      S.push(V3);
      p += 1;
     }
  }
 long res = S.top();
 S.pop();
 return res;
}

int main(void)
{
 fstream fin("evaluare.in",ios::in);
 fstream fout("evaluare.out",ios::out);
 fin >> sir;
 pfx();
 fout << eval();
 fin.close();
 fout.close();
 return 0;
}