Cod sursa(job #3004929)

Utilizator razviOKPopan Razvan Calin razviOK Data 16 martie 2023 18:07:02
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 100001
#define LMAX 2

char op[3][3] = {"+-","*/"};
char *p;

typedef struct NodeT{
    int value;
    char operation;
    struct NodeT *left, *right;
} NodeT;

NodeT *Expression( int level )
{
    NodeT *x=NULL, *y=NULL;

    if( level == LMAX )
        if( *p == '(' ){
            p++;
            x = Expression(0);
            p++;
        }
        else{
            x=(NodeT*)malloc(sizeof(NodeT));
            x->value=0;
            x->operation=0;
            x->left=NULL;
            x->right=NULL;

            while(*p>='0' && *p<='9'){
                x->value=10*x->value+*p-'0';
                p++;
            }
        }
    else{
        x = Expression( level+1 );

        while(strchr(op[level],*p)!=NULL){
            y =(NodeT *)malloc(sizeof(NodeT));
            y->value=0;
            y->operation=*p++;
            y->left=x;
            y->right=Expression(level+1);
            x=y;
        }
    }

    return x;
}
int eval(NodeT *node )
{
    switch( node->operation ){
    case '+':
        return eval( node->left ) + eval( node->right );
    case '-':
        return eval( node->left ) - eval( node->right );
    case '*':
        return eval( node->left ) * eval( node->right );
    case '/':
        return eval( node->left ) / eval( node->right );
    default:
        return node->value;
    }
}

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

    p=(char*)malloc(BUFFER_SIZE);
    fgets( p,BUFFER_SIZE, stdin );
    p=(char*)realloc(p,strlen(p));

    NodeT *root=NULL;
    root=Expression( 0 );
    printf( "%d\n", eval( root ) );

    return 0;
}