Pagini recente » Cod sursa (job #2610552) | Cod sursa (job #2228971) | Cod sursa (job #1792675) | Cod sursa (job #1566344) | Cod sursa (job #2883703)
#include <fstream>
#include <stack>
#include <string.h>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
stack <int>f; /// factors
stack <char>o; /// operators
char s[100001];
int i;
int factor()
{
int nr = 0;
while( s[i] >= '0' && s[i] <= '9' )
{
nr = nr * 10 + (s[i] - '0');
i++;
}
return nr;
}
int priority( char op)
{
if( op == '+' || op == '-' )
return 1;
if( op == '*' || op == '/' )
return 2;
return 0;
}
int compute( int a,int b, char op)
{
if( op == '+' )
return a + b;
if( op == '-' )
return b - a;
if( op == '*' )
return a * b;
if( op == '/' && a )
return b / a;
return 0;
}
void computelast()
{
int f1=0, f2=0;
char op;
if( f.size() )
{
f1 = f .top();
f.pop();
}
if ( f.size() )
{
f2 = f .top();
f.pop();
}
if( o.size() )
{
op = o.top();
o.pop();
}
f.push(compute(f1, f2, op) );
}
int main()
{
int n;
cin.getline(s,100001);
n = strlen(s);
while( i < n )
{
if( s[i] >= '0' && s[i] <= '9' )
{
f.push(factor());
}
else
if(s[i]=='(')
{
o.push(s[i]);
i++;
}
else
if(s[i]==')')
{
while( o.size() && o.top() != '(' )
computelast();
i++;
o.pop();
}
else if( priority(s[i]))
{
while( o.size() && f.size() && priority(o.top()) >= priority(s[i]))
computelast();
if( priority(s[i]) )
o.push(s[i]);
i++;
}
else
i++;
}
while ( o.size() && f.size() )
{
computelast();
}
cout << f.top();
return 0;
}