Cod sursa(job #2193124)

Utilizator horiacoolNedelcu Horia Alexandru horiacool Data 8 aprilie 2018 22:15:10
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.33 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout("evaluare.out");

#define NMAX 100003
#define ll  long long

char e[NMAX];
int N;
ll SOL;

struct stiva
{
    ll numar;
    char schar;
} St[NMAX];
int u;

bool numar(char c)
{
    int n = c - '0';
    if( 0 <= n && n <= 9 )
        return true;
    return false;
}

void next(int &i, char& vsgn, ll& val)
{
    vsgn = e[i];
    val = 0;
    if( numar(e[i]) == true )
    {
        val = e[i]-'0';
        while( numar(e[++i]) == true )
           val = val*10 + ( e[i] - '0' );
        i--;
        vsgn = '$';
    }
}

void St_push(ll n, char s)
{
    u++;
    St[u].numar = n;
    St[u].schar = s;
}

void St_pop()
{
    u--;
}

int pow(char c)
{
    switch(c)
    {
        case '-' : return 1 ;
        case '+' : return 1 ;
        case '/' : return 2 ;
        case '*' : return 2 ;
        break;
    }
    return 0;
}

ll fct(ll a, char c, ll b)
{
    switch(c)
    {
        case '-' : return (a-b) ;
        case '+' : return (a+b) ;
        case '/' : return (a/b) ;
        case '*' : return (a*b) ;
        break;
    }
    return 0;
}

int main()
{
    fin >> e;
    N = strlen(e);

    int i;
    ll val;
    char vsgn, s1, s2;

    u = 0, N++; e[N] = ')';

    for(i = 0 ; i < N ; ++i)
    {
       if( i == N-1 )
          SOL = St[u].numar;

       next(i,vsgn,val);

       if( vsgn != '$' ) {
          if( vsgn == ')' )
          {
              val = St[u].numar;
              vsgn= St[u].schar;
              St_pop(), St_pop();
          }
          else
          {
              St_push( val, vsgn );
              continue;
          }
       }

       while(true)
       {
           if( u == 0 || St[u].schar == '(' )
           {
               St_push( val, vsgn );
               break;
           }

           s1 = St[u].schar;
           if( i + 1 >= N ) s2 = ')'; else s2 = e[i+1];

           if( s2 == ')' || pow(s2) <= pow(s1) )
           {
               val = fct( St[u-1].numar, St[u].schar, val );
               St_pop(), St_pop();
           }
           else
           {
               St_push( val, vsgn );
               break;
           }
       }
    }
    fout << SOL ;
}