diff options
Diffstat (limited to 'comp/work/37/rpn.c')
-rw-r--r-- | comp/work/37/rpn.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/comp/work/37/rpn.c b/comp/work/37/rpn.c new file mode 100644 index 0000000..aefd971 --- /dev/null +++ b/comp/work/37/rpn.c @@ -0,0 +1,73 @@ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <math.h> + +#include "stack.h" + +int main(int argc, char **argv){ + stack *s = initstack(0, 64); + char in[128] = {0}; + + if (argc > 1){ + for (int i = 1; i < argc; i++){ + strcat(in, argv[i]); + strcat(in, " "); + } + } else fgets(in, 128, stdin); + + for (int i = 0; i < 128; i++) if (in[i] == '\n') in[i] = '\0'; + fflush(stdin); + + int r; + + int a; + int b; + + char *tok = strtok(in, " "); + while (tok != NULL){ + switch (tok[0]) { + case '+': + a = s->pop(s); + b = s->pop(s); + s->push(s, b+a); + break; + case '-': + a = s->pop(s); + b = s->pop(s); + s->push(s, b-a); + break; + case '*': + a = s->pop(s); + b = s->pop(s); + s->push(s, b*a); + break; + case '/': + a = s->pop(s); + b = s->pop(s); + s->push(s, b/a); + break; + case '^': + a = s->pop(s); + b = s->pop(s); + s->push(s, pow(b, a)); + break; + case '.': + r = s->pop(s); + printf("%d\n", r); + break; + default: + s->push(s, atoi(tok)); + break; + } + tok = strtok(NULL, " "); + if (tok == NULL){ + r = s->pop(s); + printf("%d\n", r); + break; + } + } + s->free(s); + return 0; +} |