GPR2_Exercise01/main.c++

91 lines
1.8 KiB
C++

/*
Postfix calculator
file: main.c++
author: Jakob Klepp
date: 2017-03-09
*/
#include <iostream>
#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;
}
}