bool isOperator(char c)
{
return (c == '+' || c == '-' || c == '*' || c == '/' || c == '$');
}
double evaluateOperator(char opr, double d1, double d2)
{
switch (opr)
{
case '+' : return d1 + d2;
case '-' : return d1 - d2;
case '*' : return d1 * d2;
case '/' : return d1 / d2;
case '$' : return pow(d1, d2);
default : return 0;
}
}
double nextOperand(const string& expr, int& i)
{
int j = i;
while (j < expr.length() && expr[j] != ' ')
j++;
string number = expr.substr(i, j-i);
i = j;
return stod(number);
}
double evalPrefix(const string& prefix_expr, int& i)
{
while (i < prefix_expr.length())
{
if (prefix_expr[i] == ' ')
i++;
else
{
if (isOperator(prefix_expr[i]))
{
char ch = prefix_expr[i];
i++;
double x = evalPrefix(prefix_expr, i);
i++;
double y = evalPrefix(prefix_expr, i);
return evaluateOperator(ch, x, y);
}
else
{
return nextOperand(prefix_expr, i);
}
}
}
}
double evaluate_prefix(const string& prefix_expr)
{
int i = 0;
double d = evalPrefix(prefix_expr, i);
return d;
}
나 같은 병신이 또 있을까 싶어 올려둔다.
잘하네
겸손의 제왕이신가 - dc App
전위형 수식을 토큰의 리스트로 변환하는 일을 별도의 함수로 빼내면 더 나음. evalPrefix 에서는 두가지 일을 하고 있어서 테스트하기 더 어려움