Pagini recente » Cod sursa (job #1471823) | Cod sursa (job #877756) | Cod sursa (job #661529) | Cod sursa (job #675771) | Cod sursa (job #3004929)
#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;
}