#include "RPN.hpp" int add(int first, int second) { return first + second; } int subst(int first, int second) { return first - second; } int mult(int first, int second) { return first * second; } int div(int first, int second) { if (second == 0) throw std::invalid_argument("division by 0 is not possible"); return first / second; } typedef int (*OperatorFunctions)(int, int); void rpn(char *av) { OperatorFunctions calc[128] = { NULL }; calc[(int) '+'] = &add; calc[(int) '-'] = &subst; calc[(int) '*'] = &mult; calc[(int) '/'] = ÷ std::istringstream ss_input((std::string(av))); std::stack stack; std::string value; while (ss_input >> value) { if (value.size() != 1) throw std::invalid_argument("invalid value"); if (isdigit(value[0])) { stack.push(value[0] - '0'); continue ; } if (!calc[(int) value[0]]) throw std::invalid_argument("invalid character"); if (stack.size() < 2) throw std::range_error("not enough operands"); int a = stack.top(); stack.pop(); int b = stack.top(); stack.pop(); stack.push(calc[(int) value[0]](b, a)); } if (stack.size() != 1) throw std::range_error("there are too many operands"); std::cout << stack.top() << std::endl; }