Pagini recente » Rating Mateita David (napsausage) | Cod sursa (job #2036300) | Cod sursa (job #1567741) | Monitorul de evaluare | Cod sursa (job #1333478)
#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());
}