/* Postfix calculator file: main.c++ author: Jakob Klepp date: 2017-03-09 */ #include #include "stack.h++" typedef enum e_inputType { BINARY_OPERATION, EVALUATE, NUMBER, } InputType; typedef struct t_input { InputType inputType; int value; } Input; Input getInput(); int operateBinary(char op, int n1, int n2); int main(int argc, char const *argv[]) { Stack stack = Stack_new(); Input in; int n1, n2, res; bool evaluated = false; do { in = getInput(); switch (in.inputType) { case BINARY_OPERATION: n2 = Stack_pop(&stack); n1 = Stack_pop(&stack); res = operateBinary(in.value, n1, n2); Stack_push(&stack, res); break; case EVALUATE: std::cout << Stack_pop(&stack) << '\n'; evaluated = true; break; case NUMBER: Stack_push(&stack, in.value); break; } } while (!Stack_isEmpty(&stack) && !evaluated); Stack_destroy(&stack); return 0; } Input getInput() { char in; int number; while (true) { std::cin.get(in); if ('+' == in || '-' == in || '*' == in || '/' == in || '%' == in) { return (Input){ BINARY_OPERATION, in }; } else if ('=' == in) { return (Input){ EVALUATE, '=' }; } else if ('0' <= in && '9' >= in) { number = in - '0'; for (int i = 1; i <= 10; i++) { std::cin.get(in); if ('0' <= in && '9' >= in) { number = number * 10 + in - '0'; } else { break; } } return (Input){ NUMBER, number }; } } } int operateBinary(char op, int n1, int n2) { switch (op) { case '+': return n1 + n2; case '-': return n1 - n2; case '*': return n1 * n2; case '/': return n1 / n2; case '%': return n1 % n2; } }