Pewny jesteś, że algorytm poprawnie uwzględnia kolejność wykonywania działań? Dlaczego czy_parzysta() wywołujesz przed obliczeniem działania?
Tu masz przykład prostego parsera:
char peek_sws(std::istream &is)
{
char c;
while(isspace(c = is.peek())) is.get();
return c;
}
int value(std::istream &is)
{
int v;
is >> v;
return v;
}
int muldiv(std::istream &is)
{
int v = value(is);
char op;
while((op = peek_sws(is)) != EOF)
{
switch(op)
{
case '*': is.get(); v *= value(is); break;
case '/': is.get(); v /= value(is); break;
default: return v;
};
}
return v;
}
int expression(std::istream &is)
{
char op;
int v = muldiv(is);
while((op = peek_sws(is)) != EOF)
{
switch(op)
{
case '+': is.get(); v += muldiv(is); break;
case '-': is.get(); v -= muldiv(is); break;
default: return v;
};
}
return v;
}
int main()
{
std::istringstream iss("7 + 8 * 3 + 9 - 1 =");
std::cout << expression(iss) << '\n';
return 0;
}