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