Pagini recente » Cod sursa (job #1561930) | Cod sursa (job #1229189) | Cod sursa (job #1025914) | Cod sursa (job #2876989) | Cod sursa (job #2193124)
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout("evaluare.out");
#define NMAX 100003
#define ll long long
char e[NMAX];
int N;
ll SOL;
struct stiva
{
ll numar;
char schar;
} St[NMAX];
int u;
bool numar(char c)
{
int n = c - '0';
if( 0 <= n && n <= 9 )
return true;
return false;
}
void next(int &i, char& vsgn, ll& val)
{
vsgn = e[i];
val = 0;
if( numar(e[i]) == true )
{
val = e[i]-'0';
while( numar(e[++i]) == true )
val = val*10 + ( e[i] - '0' );
i--;
vsgn = '$';
}
}
void St_push(ll n, char s)
{
u++;
St[u].numar = n;
St[u].schar = s;
}
void St_pop()
{
u--;
}
int pow(char c)
{
switch(c)
{
case '-' : return 1 ;
case '+' : return 1 ;
case '/' : return 2 ;
case '*' : return 2 ;
break;
}
return 0;
}
ll fct(ll a, char c, ll b)
{
switch(c)
{
case '-' : return (a-b) ;
case '+' : return (a+b) ;
case '/' : return (a/b) ;
case '*' : return (a*b) ;
break;
}
return 0;
}
int main()
{
fin >> e;
N = strlen(e);
int i;
ll val;
char vsgn, s1, s2;
u = 0, N++; e[N] = ')';
for(i = 0 ; i < N ; ++i)
{
if( i == N-1 )
SOL = St[u].numar;
next(i,vsgn,val);
if( vsgn != '$' ) {
if( vsgn == ')' )
{
val = St[u].numar;
vsgn= St[u].schar;
St_pop(), St_pop();
}
else
{
St_push( val, vsgn );
continue;
}
}
while(true)
{
if( u == 0 || St[u].schar == '(' )
{
St_push( val, vsgn );
break;
}
s1 = St[u].schar;
if( i + 1 >= N ) s2 = ')'; else s2 = e[i+1];
if( s2 == ')' || pow(s2) <= pow(s1) )
{
val = fct( St[u-1].numar, St[u].schar, val );
St_pop(), St_pop();
}
else
{
St_push( val, vsgn );
break;
}
}
}
fout << SOL ;
}