Pagini recente » Cod sursa (job #2560996) | Cod sursa (job #653187) | Cod sursa (job #120067) | Cod sursa (job #1843000) | Cod sursa (job #2789402)
#include <fstream>
#include <cstring>
#define NMAX 100005
using namespace std;
ifstream in ("evaluare.in");
ofstream out ("evaluare.out");
char s[NMAX];
int i;
int factori[NMAX];
int nrfactori;
char operatori[NMAX];
int nroperatori;
bool isdigit(char x)
{
return x >= '0' && x <= '9';
}
int prioritate (char x)
{
if (x == '+' || x == '-')
return 1;
if (x == '*' || x == '/')
return 2;
return 0;
}
void pushfactor (int x)
{
factori[nrfactori] = x;
nrfactori++;
}
void pushoperator (char x)
{
if (x == '+' || x == '-' || x == '*' || x == '/' || x == '(' || x == ')')
{
operatori[nroperatori] = x;
nroperatori++;
}
}
int poplastfactor ()
{
if (nrfactori)
{
nrfactori--;
return factori[nrfactori];
}
return 0;
}
char poplastoperator ()
{
if (nroperatori)
{
nroperatori--;
return operatori[nroperatori];
}
return '\0';
}
char lastoperator ()
{
if (nroperatori)
return operatori[nroperatori-1];
return '\0';
}
int factor ()
{
int nr = 0;
while (isdigit(s[i]))
{
nr = nr * 10 + s[i] - '0';
++i;
}
return nr;
}
int calculeaza (int a, int b, char op)
{
if (op == '+')
return a + b;
else if (op == '-')
return a - b;
else if (op == '*')
return a * b;
else if (op == '/')
return a / b;
}
int combina ()
{
int b = poplastfactor();
int a = poplastfactor();
pushfactor(calculeaza(a, b, poplastoperator()));
}
int main()
{
in.getline(s, NMAX);
int n;
n=strlen(s);
i = 0;
while(i < n)
{
if (isdigit(s[i]))
pushfactor(factor());
else if (s[i] == '(')
{
pushoperator('(');
++i;
}
else if (s[i] == ')')
{
while (lastoperator() != '(')
{
combina();
}
poplastoperator();
++i;
}
else if (prioritate(s[i]))
{
while (prioritate(lastoperator()) && prioritate(lastoperator()) >= prioritate(s[i]))
combina();
pushoperator(s[i]);
++i;
}
else
++i;
}
while(nroperatori > 0)
combina();
out << poplastfactor();
return 0;
}