-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstacmin.py
More file actions
118 lines (91 loc) · 2.72 KB
/
Copy pathstacmin.py
File metadata and controls
118 lines (91 loc) · 2.72 KB
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import sys
import traceback
import cgitb
import logging
cgitb.enable(format='text')
class StakMin:
MAXNUMBER = sys.maxint - 1
def __init__(self):
self.stack = []
self.istack = []
self.minValue = self.MAXNUMBER
def push(self, Value):
self.stack.append(Value)
if (Value < self.minValue):
self.istack.append(Value)
self.minValue = Value
def pop(self):
if (self.stack.__len__() == 0):
return self.minValue
Value = self.stack[-1]
self.stack.pop()
if (Value == self.minValue):
self.istack.pop()
if (self.istack.__len__() == 0):
self.minValue = StakMin.MAXNUMBER
else:
self.minValue = self.istack[-1]
return Value
def min(self):
return self.minValue
class commander:
stack_min = None;
def __init__(self):
self.num_parameters=0
self.value = 0
self.has_res = True
@staticmethod
def set_stack(inn):
commander.stack_min=inn
def execute(self):
return
class push(commander):
def __init__(self):
self.num_parameters=1
self.value = 0
self.has_res = False
def execute(self ):
self.stack_min.push(self.value)
return None
class pop(commander):
def execute(self):
res = self.stack_min.pop()
return res
class min(commander):
def execute(self):
res = self.stack_min.min()
return res
class parser:
def __init__(self, logger):
self.logger=logger
commander.set_stack(StakMin())
self.StackMin = min()
self.StackPush = push()
self.StackPop = pop()
self.res=None
self.Command =None
self.commands={"PUSH":self.StackPush,"POP":self.StackPop,"MIN":self.StackMin}
def parseLine(self, line):
Delimeters = ','
commands = line.split(Delimeters)
res=None
for command in commands:
spacers = ' '
parameters = command.split(spacers)
res=self.parse(parameters)
return res
def parse(self, parameters):
self.Command = self.commands[parameters[0]]
if (self.Command.num_parameters==1):
self.Command.value = int(parameters[1])
self.logger.info( parameters)
self.res=self.Command.execute()
if (self.Command.has_res):
self.logger.info("res %s " % (self.res))
return self.res
if __name__ == "__main__":
# try:
test1 = parser()
test1.parseLine("PUSH 10,PUSH 3,PUSH 1,POP,MIN,POP,MIN,PUSH 11,PUSH 7,PUSH 8,PUSH 9,MIN,POP,MIN,POP,MIN,POP,MIN")
# except:
# traceback.print_tb(10)