91 lines
1.8 KiB
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;
|
|
}
|
|
}
|