Pagini recente » Cod sursa (job #2806011) | Cod sursa (job #3260067) | Cod sursa (job #1928793) | Cod sursa (job #655173) | Cod sursa (job #2870267)
#include <bits/stdc++.h>
#define N 100008
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int n;
char s[N];
map< char, int > prec;
void Citire()
{
fin >> s + 1;
n = strlen( s + 1 );
prec['('] = 0;
prec[')'] = 0;
prec['+'] = 1;
prec['-'] = 1;
prec['*'] = 2;
prec['/'] = 2;
}
stack<char> ops;
stack<int> values;
inline int rez( int val1, int val2, char op )
{
if( op == '+' )
return val1 + val2;
if( op == '-' )
return val1 - val2;
if( op == '*' )
return val1 * val2;
if( op == '/' )
return val1 / val2;
return 0;
}
void Rezolvare()
{
int i;
for( i=1; i<=n; i++ )
{
if( isdigit( s[i] ) )
{
int nr = 0;
while( isdigit( s[i] ) )
nr = nr * 10 + ( s[i] - '0' ), i++;
i--;
values.push( nr );
continue;
}
if( s[i] == '(' )
{
ops.push( s[i] );
continue;
}
if( s[i] == ')' )
{
while( !ops.empty() && ops.top() != '(' )
{
int val1, val2;
val2 = values.top();
values.pop();
val1 = values.top();
values.pop();
char op;
op = ops.top();
ops.pop();
values.push( rez( val1, val2, op ) );
}
ops.pop();
continue;
}
if( s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' )
{
while( !ops.empty() && prec[ ops.top() ] >= prec[ s[i] ] )
{
int val1, val2;
val2 = values.top();
values.pop();
val1 = values.top();
values.pop();
char op;
op = ops.top();
ops.pop();
values.push( rez( val1, val2, op ) );
}
ops.push( s[i] );
}
}
while( !ops.empty() )
{
int val1, val2;
val2 = values.top();
values.pop();
val1 = values.top();
values.pop();
char op;
op = ops.top();
ops.pop();
values.push( rez( val1, val2, op ) );
}
fout << values.top();
}
int main()
{
Citire();
Rezolvare();
//cout << sizeof( Lee ) / 1024.0 / 1024.0;
return 0;
}