diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2024-10-07 13:01:30 +0100 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2024-10-07 13:01:30 +0100 |
commit | 3564e513623bb3fc4d528d3d29df9aa91dae1396 (patch) | |
tree | 17d60d15b9c21db957ef966fc3eb763fd11fd244 /comp/work | |
parent | ce61e41c6a14b84808aceb37d5118f23e3affaa0 (diff) |
did some electronics and comp sci work
Diffstat (limited to 'comp/work')
-rw-r--r-- | comp/work/37/Makefile | 5 | ||||
-rwxr-xr-x | comp/work/37/rpn | bin | 0 -> 19688 bytes | |||
-rw-r--r-- | comp/work/37/rpn.c | 73 | ||||
-rw-r--r-- | comp/work/37/stack.c | 42 | ||||
-rw-r--r-- | comp/work/37/stack.h | 10 |
5 files changed, 130 insertions, 0 deletions
diff --git a/comp/work/37/Makefile b/comp/work/37/Makefile new file mode 100644 index 0000000..01e2722 --- /dev/null +++ b/comp/work/37/Makefile @@ -0,0 +1,5 @@ +rpn: rpn.c stack.c + cc stack.c -c -o stack.o + cc rpn.c stack.o -o rpn -lm -ggdb +clean: + rm -rf rpn stack.o diff --git a/comp/work/37/rpn b/comp/work/37/rpn Binary files differnew file mode 100755 index 0000000..e087f49 --- /dev/null +++ b/comp/work/37/rpn 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; +} diff --git a/comp/work/37/stack.c b/comp/work/37/stack.c new file mode 100644 index 0000000..3c1ab19 --- /dev/null +++ b/comp/work/37/stack.c @@ -0,0 +1,42 @@ +#include <stddef.h> +#include <stdlib.h> + +typedef struct stack { + int *sp; + int value; + int (*pop)(struct stack *stack); + void (*push)(struct stack *stack, int value); + void (*free)(struct stack *strack); + int *stack; +} stack; + +int pop(stack *stack){ + stack->sp -= sizeof(int); + int i = *stack->sp; + *stack->sp = stack->value; + return i; +} + +void push(stack *stack, int value){ + *stack->sp = value; + stack->sp += sizeof(int); +} + +void deinitstack(stack *stack){ + free(stack->stack); + free(stack); + stack = NULL; +} + +stack *initstack(int value, size_t size){ + stack *s = malloc(sizeof(stack)); + s->stack = calloc(0, size*sizeof(int)); + s->sp = s->stack; + s->value = value; + s->pop = &pop; + s->push = &push; + s->free = &deinitstack; + + return s; +} + diff --git a/comp/work/37/stack.h b/comp/work/37/stack.h new file mode 100644 index 0000000..03390ba --- /dev/null +++ b/comp/work/37/stack.h @@ -0,0 +1,10 @@ +typedef struct stack { + int *sp; + int value; + int (*pop)(struct stack *stack); + void (*push)(struct stack *stack, int value); + void (*free)(struct stack *stack); + int *stack; +} stack; + +stack *initstack(int value, size_t size); |