Cod sursa(job #2560521)

Utilizator Florinos123Gaina Florin Florinos123 Data 28 februarie 2020 08:28:24
Problema Evaluarea unei expresii Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

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

char s[100005];
int aux[100005];
stack < int > stiva;

int solve (int st, int dr)
{
  char semn = '+';
  int numar, i, j, rez = 0;
   for (i=st; i<=dr; i++)
   {
       if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
         semn = s[i];

       if (s[i] >= '0' && s[i] <= '9')
       {
           j = i, numar = 0;
            while (s[j] >= '0' && s[j] <= '9')
            {
               numar = numar * 10 + s[j] - '0';
               j ++;
            }
          i = j-1;

          if (semn == '*')
          {
              if (rez == 0)
                 rez = 1;
              rez *= numar;
          }
          if (semn == '+')
            rez += numar;
          if (semn == '-')
            rez -= numar;
          if (semn == '/')
            rez /= numar;
       }

       if (s[i] == '(')
       {
         if (semn == '+')
             rez += solve(i+1, aux[i]-1);
         if (semn == '/')
             rez /= solve(i+1, aux[i]-1);
         if (semn == '*')
         {
             if (rez == 0)
                rez = 1;
             rez *= solve(i+1, aux[i]-1);
         }
         if (semn == '-')
             rez -= solve(i+1, aux[i]-1);

         i = aux[i];
       }
   }
  return rez;
}

void precalc ()
{
  int i, x;
   for (i=0; s[i]; i++)
   {
       if (s[i] == '(')
          stiva.push(i);
       if (s[i] == ')')
       {
           x = stiva.top();
           stiva.pop(), aux[x] = i;
       }
   }
}

int main()
{
 f >> s;
 precalc();
 g << solve(0, strlen(s)-1);
    return 0;
}