Pagini recente » Atasamentele paginii Transport | Cod sursa (job #1423317) | Cod sursa (job #2788132) | Cod sursa (job #1333037) | Cod sursa (job #2149636)
#include <fstream>
#include <stack>
#include <queue>
#include <iostream>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
int x,t,dc;
char c,p[128];
bool ok;
queue <int> tl;
stack <int> sv;
inline int Decode ( char c )
{
switch (c)
{
case '+' :
return -1;
case '-' :
return -2;
case '*' :
return -3;
case '/' :
return -4;
case '(' :
return -5;
}
}
inline void doMath ( int &a, int b, int c )
{
switch (c)
{
case -1 :
a += b;
break;
case -2 :
a -= b;
break;
case -3 :
a *= b;
break;
case -4 :
a /= b;
break;
}
}
inline char Crack ( int x )
{
switch (x)
{
case -1 :
return '+';
case -2 :
return '-';
case -3 :
return '*';
case -4 :
return '/';
case -5 :
return '(';
}
}
inline void printQ ( queue <int> q )
{
cout << "Queue : ";
for ( ; !q.empty(); q.pop() )
if ( q.front() >= 0 )
cout << q.front() << " ";
else
cout << Crack( q.front() ) << " ";
cout << '\n';
}
inline void printS ( stack <int> s )
{
cout << "Stack : ";
for ( ; !s.empty(); s.pop() )
if ( s.top() >= 0 )
cout << s.top() << " ";
else
cout << Crack ( s.top() ) << " ";
cout << '\n';
}
inline void Solve ()
{
if ( ok )
tl.push (x), x = 0;
ok = 0;
switch (c)
{
case ')' :
{
while ( sv.top() != -5 ) /// '(' = -5
tl.push ( sv.top() ), sv.pop();
sv.pop();
break;
}
case '(' :
{
sv.push ( -5 );
break;
}
default :
{
dc = Decode (c);
t = dc + 5;
while ( !sv.empty() && p[sv.top() + 5] >= p[t] )
tl.push ( sv.top() ), sv.pop();
sv.push ( dc );
}
}
}
int main()
{
p[1] = p[2] = 2;
p[3] = p[4] = 1;
while ( fin >> c )
{
if ( c >= '0' && c <= '9' )
x = x * 10 + c - '0', ok = 1;
else
Solve();
}
if ( ok )
tl.push (x);
while ( !sv.empty() )
tl.push ( sv.top() ), sv.pop();
while ( !tl.empty() )
{
x = tl.front();
if ( x >= 0 )
sv.push (x);
else
{
t = sv.top();
sv.pop();
doMath ( sv.top(), t, x );
}
tl.pop();
}
fout << sv.top();
}