Skip to content

Commit 19e8091

Browse files
stack of plates, one of my favorites
1 parent 2500f4d commit 19e8091

File tree

1 file changed

+151
-0
lines changed
  • Python/chapter03/3.3 - Stack of Plates

1 file changed

+151
-0
lines changed
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
#!/usr/bin/python3
2+
3+
import unittest
4+
from random import randint
5+
6+
7+
class SetofStacks:
8+
def __init__(self, limit=5):
9+
self.stack = []
10+
self.pointer = None
11+
self.limit = limit
12+
13+
def length(self):
14+
if self.pointer is None:
15+
return 0
16+
else:
17+
tlength = self.pointer * self.limit
18+
s = self.stack[self.pointer]
19+
for x in s.stack:
20+
tlength += 1
21+
return tlength
22+
23+
def push(self, value):
24+
if self.pointer is None:
25+
# set pointer, add to stack
26+
self.addNewStack(value)
27+
self.pointer = 0
28+
else:
29+
# check for limit before creating
30+
# or adding a new stack
31+
s = self.stack[self.pointer]
32+
if s.length() == self.limit:
33+
self.addNewStack(value)
34+
self.pointer += 1
35+
else:
36+
s.push(value)
37+
38+
def addNewStack(self, value):
39+
if not value:
40+
print('No value to add to stack')
41+
return
42+
s = Stack()
43+
s.push(value)
44+
self.stack.append(s)
45+
46+
def popLastStack(self):
47+
if self.length() == 0:
48+
print('No set of stacks to pop')
49+
return
50+
s = self.stack[self.pointer]
51+
s.pop()
52+
if self.length() == 0:
53+
if s.length() == 0:
54+
self.pointer = 0
55+
else:
56+
if s.length() == 0:
57+
del self.stack[self.pointer]
58+
self.pointer -= 1
59+
60+
def printAllStacks(self):
61+
print('pointer', self.pointer)
62+
print('length', self.length())
63+
for x in range(len(self.stack)):
64+
print('Set number {} and values -> {}'.format(x,
65+
self.stack[x].stack))
66+
67+
68+
class Stack:
69+
def __init__(self):
70+
self.stack = []
71+
self.min = None
72+
73+
def getMin(self):
74+
return self.min
75+
76+
def pop(self):
77+
if not self.length:
78+
print('No stack to pop')
79+
return
80+
81+
item = self.stack.pop()
82+
print('Item popped', item)
83+
84+
if item == self.min:
85+
if self.length() > 0:
86+
self.findMin()
87+
else:
88+
self.min = None
89+
return item
90+
91+
def findMin(self):
92+
self.min = self.stack[0]
93+
for x in self.stack:
94+
if x < self.min:
95+
self.min = x
96+
97+
def length(self):
98+
return len(self.stack)
99+
100+
def push(self, value):
101+
if not self.min:
102+
self.min = value
103+
elif value < self.min:
104+
self.min = value
105+
106+
self.stack.append(value)
107+
print('Item added to stack', value)
108+
109+
def peek(self):
110+
if not self.length:
111+
print('No stack to peek')
112+
return
113+
print('Peeking into stack', self.stack[-1])
114+
115+
def printStack(self):
116+
if not self.length:
117+
print('No stack to peeek')
118+
return
119+
120+
print("Top of stack\n _ ")
121+
for x in self.stack[::-1]:
122+
print('|', x, '|')
123+
print('|', '_', '|')
124+
125+
126+
class Test(unittest.TestCase):
127+
@classmethod
128+
def setUpClass(cls):
129+
pass
130+
131+
@classmethod
132+
def tearDownClass(cls):
133+
pass
134+
135+
def generateRand(self, size=15):
136+
return [randint(0, 100) for x in range(size)]
137+
138+
def test1(self):
139+
arr = self.generateRand()
140+
setStack1 = SetofStacks()
141+
for x in arr:
142+
setStack1.push(x)
143+
setStack1.printAllStacks()
144+
145+
for x in range(randint(7, len(arr))):
146+
setStack1.popLastStack()
147+
setStack1.printAllStacks()
148+
149+
150+
if __name__ == '__main__':
151+
unittest.main()

0 commit comments

Comments
 (0)