summaryrefslogtreecommitdiff
path: root/comp/work/37/rpn.c
blob: aefd9718b13ebdbe656c46d104ae087a83a7a873 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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;
}