「✨」 feat(ex01): RPN is working :D
This commit is contained in:
55
ex01/RPN.cpp
Normal file
55
ex01/RPN.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
#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['+'] = &add;
|
||||
calc['-'] = &subst;
|
||||
calc['*'] = &mult;
|
||||
calc['/'] = ÷
|
||||
|
||||
std::istringstream ss_input((std::string(av)));
|
||||
std::stack<int> 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user