Pagini recente » Cod sursa (job #3200541) | Cod sursa (job #351720) | Cod sursa (job #2897320) | Cod sursa (job #1332760) | Cod sursa (job #1997985)
#include <fstream>
#define MAXN 100012
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int ps, pi, vf, stiva[MAXN], nr;
struct punct{
int val, tip;
};
punct coada[MAXN];
inline void Initializer(void)
{
ps = 1; pi = 0; vf = 0;
}
inline bool EsteCifra(char c)
{
if (c >= '0' && c <= '9')
return true;
return false;
}
inline void SetPostfix(void)
{
char chr;
fin >> chr;
while (!fin.eof())
{
if (chr == '(')
{
stiva[++vf] = chr;
fin >> chr;
}
else if (EsteCifra(chr))
{
nr = 0;
while (EsteCifra(chr) && !fin.eof())
{
nr *= 10;
nr += (chr - '0');
fin >> chr;
}
coada[++pi].val = nr;
coada[pi].tip = -1; /// -1 = intreg; 1 = char
}
else if (chr == ')')
{
while (stiva[vf] != '(' && vf > 0)
{
coada[++pi].val = stiva[vf];
coada[pi].tip = 1;
vf--;
}
vf--; ///elimin '('
fin >> chr;
}
else
{
if (chr == '+' || chr == '-')
{
while (stiva[vf] != '(' && vf > 0)
{
coada[++pi].val = stiva[vf];
coada[pi].tip = 1;
vf--;
}
stiva[++vf] = chr;
fin >> chr;
}
else
{
while (stiva[vf] == '*' && stiva[vf] == '/' && vf > 0)
{
coada[++pi].val = stiva[vf];
coada[pi].tip = 1;
vf--;
}
stiva[++vf] = chr;
fin >> chr;
}
}
}
while (vf > 0)
{
coada[++pi].val = stiva[vf];
coada[pi].tip = 1;
vf--;
}
}
inline void Evaluate(void)
{
while (ps <= pi)
{
if (coada[ps].tip == -1) ///e intreg
{
stiva[++vf] = coada[ps].val;
}
else
{
if (coada[ps].val == '+')
{
stiva[vf - 1] = stiva[vf - 1] + stiva[vf];
vf--;
}
else if (coada[ps].val == '-')
{
stiva[vf - 1] = stiva[vf - 1] - stiva[vf];
vf--;
}
else if (coada[ps].val == '*')
{
stiva[vf - 1] = stiva[vf - 1] * stiva[vf];
vf--;
}
else
{
stiva[vf - 1] = stiva[vf - 1] / stiva[vf];
vf--;
}
}
ps++;
}
fout << stiva[vf];
}
int main ()
{
Initializer();
SetPostfix();
Evaluate();
fin.close(); fout.close(); return 0;
}