Cod sursa(job #1333478)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 3 februarie 2015 11:05:22
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

const int MAXS = 100000;

char s[MAXS+10],*p = s;

stack <int> output;
stack <char> stiva;

int handleBinaryOperator(char c)
{
    int a, b;

    b = output.top();
    output.pop();
    a = output.top();
    output.pop();

    switch( c )
    {
        case '+':
            return a + b;
            break;

        case '-':
            return a - b;
            break;

        case '*':
            return a * b;
            break;

        case '/':
            return a / b;
            break;
    }
}

int precedence( char c )
{
   if( c == '-' || c == '+' )
        return 0;
   else return 1;
}

int evalueaza()
{
    while( *p != NULL )
    {
        if( *p == '(' )
        {
            stiva.push(*p);
            p++;
        }
        else
        if( '0' <= *p && *p <= '9' )
        {
            int nr = 0;

            while( '0' <= *p && *p <= '9' )
            {
                nr = nr*10 + *p - '0';
                p++;
            }

            output.push( nr );
        }
        else
        if( *p == ')' )
        {
            while( stiva.top() != '(' )
            {
                int nr = handleBinaryOperator( stiva.top() );
                output.push( nr );
                stiva.pop();
            }

            stiva.pop();

            p++;
        }
        else
        if( *p == '-' || *p == '+' || *p == '*' || *p =='/' )
        {
            while(  stiva.empty() == false && precedence( *p ) <= precedence( stiva.top() ) && stiva.top() != '(' )
            {
                int nr = handleBinaryOperator( stiva.top() );
                output.push( nr );
                stiva.pop();
            }

            if( stiva.empty() == true || precedence( *p ) >= precedence( stiva.top () ) || stiva.top() == '('  )
                stiva.push( *p );

            p++;
        }
    }

    while( stiva.empty() == false )
    {
        int nr = handleBinaryOperator( stiva.top() );
        output.push( nr );
        stiva.pop();
    }

    return output.top();
}


int main()
{
    freopen("evaluare.in","r",stdin);
    freopen("evaluare.out","w",stdout);

    scanf("%s",&s);
    printf("%d",evalueaza());
}