File tree Expand file tree Collapse file tree 2 files changed +89
-0
lines changed
150_evaluate_reverse_polish_notation Expand file tree Collapse file tree 2 files changed +89
-0
lines changed Original file line number Diff line number Diff line change
1
+ all :
2
+ gcc -O2 -o test eval_rpn.c
Original file line number Diff line number Diff line change
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+
4
+ static int a2i (char * s )
5
+ {
6
+ int n = 0 ;
7
+ int sign = 0 ;
8
+ while (* s != '\0' ) {
9
+ switch (s [0 ]) {
10
+ case '+' :
11
+ break ;
12
+ case '-' :
13
+ sign = 1 ;
14
+ break ;
15
+ case '*' :
16
+ break ;
17
+ case '/' :
18
+ break ;
19
+ default :
20
+ n = n * 10 + (s [0 ] - '0' );
21
+ break ;
22
+ }
23
+ s ++ ;
24
+ }
25
+ return sign ? - n : n ;
26
+ }
27
+
28
+ static int evalRPN (char * * tokens , int tokensSize )
29
+ {
30
+ int i , res , a , b ;
31
+ int stack [500 ], len = 0 ;
32
+
33
+ for (i = 0 ; i < tokensSize ; i ++ ) {
34
+ switch (tokens [i ][0 ]) {
35
+ case '\0' :
36
+ break ;
37
+ case '+' :
38
+ if (len > 0 ) {
39
+ b = stack [-- len ];
40
+ }
41
+ if (len > 0 ) {
42
+ a = stack [-- len ];
43
+ stack [len ++ ] = a + b ;
44
+ }
45
+ break ;
46
+ case '*' :
47
+ if (len > 0 ) {
48
+ b = stack [-- len ];
49
+ }
50
+ if (len > 0 ) {
51
+ a = stack [-- len ];
52
+ stack [len ++ ] = a * b ;
53
+ }
54
+ break ;
55
+ case '/' :
56
+ if (len > 0 ) {
57
+ b = stack [-- len ];
58
+ }
59
+ if (len > 0 ) {
60
+ a = stack [-- len ];
61
+ stack [len ++ ] = a / b ;
62
+ }
63
+ break ;
64
+ case '-' :
65
+ if (tokens [i ][1 ] == '\0' ) {
66
+ if (len > 0 ) {
67
+ b = stack [-- len ];
68
+ }
69
+ if (len > 0 ) {
70
+ a = stack [-- len ];
71
+ stack [len ++ ] = a - b ;
72
+ }
73
+ break ;
74
+ }
75
+ default :
76
+ stack [len ++ ] = a2i (tokens [i ]);
77
+ }
78
+ }
79
+
80
+ return len > 0 ? stack [len - 1 ] : 0 ;
81
+ }
82
+
83
+ int main (int argc , char * * argv )
84
+ {
85
+ printf ("%d\n" , evalRPN (argv + 1 , argc - 1 ));
86
+ return 0 ;
87
+ }
You can’t perform that action at this time.
0 commit comments