Pagini recente » Cod sursa (job #2642056) | Cod sursa (job #973025) | Cod sursa (job #2023605) | Cod sursa (job #1337693) | Cod sursa (job #741184)
Cod sursa(job #741184)
#include <stdio.h>
#include <stack>
using namespace std;
const int dim = 100005;
char S[dim], P[dim];
int gp[127];
void initial (char s[], int gp[])
{
fgets (s, dim, stdin);
gp[')'] = 10;
gp['+'] = gp['-'] = 15;
gp['*'] = gp['/'] = 16;
gp['('] = 20;
}
void polonez (char s[], int gp[], char a[])
{
char c;
int nr = -1;
stack <char> S;
for (int i = 0; s[i] != 0; i++)
{
c = s[i];
if ('0' <= c && c <= '9')
{
a[++nr] = '.';
for (; '0' <= c && c <= '9'; i++, c = s[i])
a[++nr] = c;
i--;
}
else
{
while (!S.empty() && gp[S.top()] >= gp[c] && S.top() != '(')
{
a[++nr] = S.top();
S.pop ();
}
if (c != ')')
S.push (c);
else
S.pop ();
}
}
while (!S.empty())
{
a[++nr] = S.top ();
S.pop ();
}
}
void evaluam (char s[])
{
char c;
int nr;
stack <int> S;
for (int i = 0; s[i] != 0; i++)
{
c = s[i];
if (c == '.')
{
nr = 0;
for (c = s[i+1]; '0' <= c && c <= '9'; i++, c = s[i+1])
nr = nr * 10 + c - '0';
S.push (nr);
}
else
{
nr = S.top ();
S.pop ();
switch (c)
{
case '+': S.top() += nr; break;
case '-': S.top() -= nr; break;
case '*': S.top() *= nr; break;
case '/': S.top() /= nr; break;
}
}
}
printf ("%d\n", S.top());
}
int main ()
{
freopen ("evaluare.in", "r", stdin);
freopen ("evaluare.out", "w", stdout);
initial (S, gp);
polonez (S, gp, P);
evaluam (P);
return 0;
}