1
1
"""
2
- Python3 program to evaluate a prefix expression.
2
+ Program to evaluate a prefix expression.
3
+ https://en.wikipedia.org/wiki/Polish_notation
3
4
"""
4
5
5
- calc = {
6
+ operators = {
6
7
"+" : lambda x , y : x + y ,
7
8
"-" : lambda x , y : x - y ,
8
9
"*" : lambda x , y : x * y ,
@@ -31,6 +32,10 @@ def evaluate(expression):
31
32
21
32
33
>>> evaluate("/ * 10 2 + 4 1 ")
33
34
4.0
35
+ >>> evaluate("2")
36
+ 2
37
+ >>> evaluate("+ * 2 3 / 8 4")
38
+ 8.0
34
39
"""
35
40
stack = []
36
41
@@ -45,11 +50,39 @@ def evaluate(expression):
45
50
# push the result onto the stack again
46
51
o1 = stack .pop ()
47
52
o2 = stack .pop ()
48
- stack .append (calc [c ](o1 , o2 ))
53
+ stack .append (operators [c ](o1 , o2 ))
49
54
50
55
return stack .pop ()
51
56
52
57
58
+ def evaluate_recursive (expression : list [str ]):
59
+ """
60
+ Alternative recursive implementation
61
+
62
+ >>> evaluate_recursive(['2'])
63
+ 2
64
+ >>> expression = ['+', '*', '2', '3', '/', '8', '4']
65
+ >>> evaluate_recursive(expression)
66
+ 8.0
67
+ >>> expression
68
+ []
69
+ >>> evaluate_recursive(['+', '9', '*', '2', '6'])
70
+ 21
71
+ >>> evaluate_recursive(['/', '*', '10', '2', '+', '4', '1'])
72
+ 4.0
73
+ """
74
+
75
+ op = expression .pop (0 )
76
+ if is_operand (op ):
77
+ return int (op )
78
+
79
+ operation = operators [op ]
80
+
81
+ a = evaluate_recursive (expression )
82
+ b = evaluate_recursive (expression )
83
+ return operation (a , b )
84
+
85
+
53
86
# Driver code
54
87
if __name__ == "__main__" :
55
88
test_expression = "+ 9 * 2 6"
0 commit comments