Cod sursa(job #853049)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 12 ianuarie 2013 01:30:21
Problema Evaluarea unei expresii Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
using namespace std;
ifstream f ( "evaluare.in" );
ofstream g ( "evaluare.out" );
#define LE 100666
#include <string>
string s;
int N;
int i, K;
int EXP[LE], stiv[LE];
int top;
int val;


int level ( char  A )
{
    if ( A == '(' || A == ')' )
        return A == '(' ? -1 : -2;

    if ( A == '+' || A == '-' )
        return A == '+' ? -3 : -4;

    return A == '*' ? -5 : -6;
}

int main()
{
    f >> s;
    N = s.length();

    for ( ; i < N; )
        if ( s[i] >= '0' && s[i] <= '9' )
        {
            for ( val = 0; i < N && s[i] >= '0' && s[i] <= '9' ; ++i )
                val = val * 10 + ( s[i] - '0' );

            EXP[++K] = val ;
        }
        else
        {
            int lev = level ( s[i++] ) ;

            if ( lev == -2 )
            {
                while ( top && stiv[top] != -1 )
                    EXP[++K] = stiv[top--] ;

                --top;
            }
            else if ( lev == -1 )
                stiv[++top] = -1;
            else
            {
                while ( top && stiv[top] <= lev )
                    EXP[++K] = stiv[top--] ;

                stiv[++top] = lev;
            }
        }




    for ( ; top; --top )
        EXP[++K] = stiv[top] ;


    top = 0;

    for ( i = 1; i <= K; ++i )
        if ( EXP[i] < 0 )
        {
            if ( EXP[i] == -3 )
                EXP[top-1] += EXP[top];

            if ( EXP[i] == -4 )
                EXP[top-1] -= EXP[top];

            if ( EXP[i] == -5 )
                EXP[top-1] *= EXP[top];

            if ( EXP[i] == -6 )
                EXP[top-1] /= EXP[top];

            --top;
        }
        else
            EXP[++top] = EXP[i];

    g << EXP[1];
    f.close();
    g.close();
    return 0;
}