1
+ # CTCI 3.1
2
+ # Three in One
3
+
4
+ import unittest
5
+
6
+ class ThreeStacks ():
7
+ def __init__ (self ):
8
+ self .array = [None , None , None ]
9
+ self .current = [0 , 1 , 2 ]
10
+
11
+ def push (self , item , stack_number ):
12
+ if not stack_number in [0 , 1 , 2 ]:
13
+ raise Exception ("Bad stack number" )
14
+ while len (self .array ) <= self .current [stack_number ]:
15
+ self .array += [None ] * len (self .array )
16
+ self .array [self .current [stack_number ]] = item
17
+ self .current [stack_number ] += 3
18
+
19
+ def pop (self , stack_number ):
20
+ if not stack_number in [0 , 1 , 2 ]:
21
+ raise Exception ("Bad stack number" )
22
+ if self .current [stack_number ] > 3 :
23
+ self .current [stack_number ] -= 3
24
+ item = self .array [self .current [stack_number ]]
25
+ self .array [self .current [stack_number ]] = None
26
+ return item
27
+
28
+
29
+ #-------------------------------------------------------------------------------
30
+ # CTCI Solution
31
+
32
+ #-------------------------------------------------------------------------------
33
+ #Testing
34
+
35
+ class Test (unittest .TestCase ):
36
+ def test_three_stacks (self ):
37
+ three_stacks = ThreeStacks ()
38
+ three_stacks .push (101 , 0 )
39
+ three_stacks .push (102 , 0 )
40
+ three_stacks .push (103 , 0 )
41
+ three_stacks .push (201 , 1 )
42
+ self .assertEqual (three_stacks .pop (0 ), 103 )
43
+ self .assertEqual (three_stacks .pop (1 ), 201 )
44
+ self .assertEqual (three_stacks .pop (1 ), None )
45
+ self .assertEqual (three_stacks .pop (2 ), None )
46
+ three_stacks .push (301 , 2 )
47
+ three_stacks .push (302 , 2 )
48
+ self .assertEqual (three_stacks .pop (2 ), 302 )
49
+ self .assertEqual (three_stacks .pop (2 ), 301 )
50
+ self .assertEqual (three_stacks .pop (2 ), None )
51
+
52
+ if __name__ == "__main__" :
53
+ unittest .main ()
0 commit comments