Skip to content

Commit

Permalink
better italian queue
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidLeoni committed Feb 10, 2020
1 parent cdcb07b commit da03e75
Show file tree
Hide file tree
Showing 3 changed files with 729 additions and 213 deletions.
38 changes: 24 additions & 14 deletions exercises/queues/italian_queue_solution.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ def set_data(self,newdata):
def set_next(self,newnext):
self._next = newnext

def __repr__(self):
return self.__str__()
def __str__(self):
return 'Node(%s,%s)' % (self._data, self._group)


class ItalianQueue:
""" An Italian queue, v1.
Expand All @@ -46,7 +52,7 @@ class ItalianQueue:
def __init__(self):
""" Initializes the queue. Note there is no capacity as parameter
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
self._head = None
Expand All @@ -59,20 +65,23 @@ def __str__(self):
a __str__ method is essential to quickly inspect the data by printing it.
"""
current = self._head
strings = []
sdata = []
sgroups = []

while (current != None):
strings.append(str((current.get_data(), current.get_group())))
sdata.append(str((current.get_data())))
sgroups.append(str((current.get_group())))
current = current.get_next()

return "ItalianQueue: " + ",".join(strings)

return "ItalianQueue: " + "->".join(sdata) + "\n " + " ".join(sgroups) + \
"\n _head: %s" % self._head + \
"\n _tail: %s" % self._tail


def size(self):
""" Return the size of the queue.
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
return self._size
Expand All @@ -81,7 +90,7 @@ def size(self):
def is_empty(self):
""" Return True if the queue is empty, False otherwise.
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
return self._head == None
Expand All @@ -91,7 +100,7 @@ def top(self):
""" Return the element at the head of the queue, without removing it.
- If the queue is empty, raises LookupError.
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
if self._head != None:
Expand All @@ -105,7 +114,7 @@ def top_group(self):
without removing it.
- If the queue is empty, raises LookupError.
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
if self._head != None:
Expand All @@ -118,7 +127,7 @@ def tail(self):
""" Return the element at the tail of the queue (without removing it)
- If the queue is empty, raises LookupError.
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
if self._tail != None:
Expand All @@ -132,7 +141,7 @@ def tail_group(self):
""" Return the group of the element at the tail of the queue (without removing it).
- If the queue is empty, raises LookupError.
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
if self._tail != None:
Expand All @@ -151,7 +160,7 @@ def enqueue(self, v, g):
same group sequence (so to the right of the group)
- otherwise v is inserted at the end of the queue
- Complexity: O(n)
- MUST run in O(n)
"""
#jupman-raise
new_node = Node(v,g)
Expand Down Expand Up @@ -187,7 +196,7 @@ def dequeue(self):
""" Removes head element and returns it.
- If the queue is empty, raises a LookupError.
- Complexity: O(1)
- MUST run in O(1)
"""
#jupman-raise
if self._head != None:
Expand All @@ -199,4 +208,5 @@ def dequeue(self):
return ret
else:
raise LookupError("Queue is empty !")
#/jupman-raise
#/jupman-raise

106 changes: 75 additions & 31 deletions exercises/queues/italian_queue_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,53 +42,55 @@ def test_01_empty(self):
class EnqueueTest(unittest.TestCase):


def test_01_ag(self):
def test_01_ax(self):
q = ItalianQueue()

q.enqueue('a', 'g') # [(a,g)]
q.enqueue('a', 'x') # [(a,x)]
self.assertFalse(q.is_empty())
self.assertEqual(q.size(), 1)
self.assertEqual(q.top(), 'a')
self.assertEqual(q.top_group(), 'g')
self.assertEqual(q.top_group(), 'x')
self.assertEqual(q.tail(), 'a')
self.assertEqual(q.tail_group(), 'g')
self.assertEqual(q.tail_group(), 'x')


def test_02_agbh(self):
def test_02_axby(self):
q = ItalianQueue()

q.enqueue('a', 'g') # [(a,g)]
q.enqueue('a', 'x') # [(a,x)]

q.enqueue('b', 'h') # [(a,g), (b,h)]
q.enqueue('b', 'y') # [(a,x), (b,y)]
self.assertEqual(q.size(), 2)
self.assertEqual(q.top(), 'a')
self.assertEqual(q.top_group(), 'g')
self.assertEqual(q.top_group(), 'x')
self.assertEqual(q.tail(), 'b')
self.assertEqual(q.tail_group(), 'h')
self.assertEqual(q.tail_group(), 'y')


def test_03_agbg(self):
def test_03_axbx(self):
q = ItalianQueue()

q.enqueue('a', 'g') # [(a,g)]
q.enqueue('b', 'g') # [(a,g), (b,g)]
q.enqueue('a', 'x') # [(a,x)]
q.enqueue('b', 'x') # [(a,x), (b,x)]
self.assertEqual(q.top(), 'a')
self.assertEqual(q.top_group(), 'g')
self.assertEqual(q.top_group(), 'x')
self.assertEqual(q.tail(), 'b')
self.assertEqual(q.tail_group(), 'g')
self.assertEqual(q.tail_group(), 'x')

def test_04_agbhcg(self):
def test_04_axbycx(self):
q = ItalianQueue()

q.enqueue('a', 'g') # [(a,g)]
q.enqueue('b', 'h') # [(a,g), (b,h)]
q.enqueue('c', 'g') # [(a,g), (c,g), (b,h)]
q.enqueue('a', 'x') # [(a,x)]
q.enqueue('b', 'y') # [(a,x), (b,y)]
q.enqueue('c', 'x') # [(a,x), (c,x), (b,y)]
self.assertEqual(q.top(), 'a')
self.assertEqual(q.top_group(), 'g')
self.assertEqual(q._head.get_next().get_data(), 'c') # white box testing: using private '_' fields
self.assertEqual(q._head.get_next().get_group(), 'g') # white box testing: using private '_' fields
self.assertEqual(q.top_group(), 'x')
# white box testing: using private '_' fields
self.assertEqual(q._head.get_next().get_data(), 'c')
# white box testing: using private '_' fields
self.assertEqual(q._head.get_next().get_group(), 'x')
self.assertEqual(q.tail(), 'b')
self.assertEqual(q.tail_group(), 'h')
self.assertEqual(q.tail_group(), 'y')



Expand All @@ -100,9 +102,9 @@ def test_01_empty(self):
with self.assertRaises(LookupError):
q.dequeue()

def test_02_ag(self):
def test_02_ax(self):
q = ItalianQueue()
q.enqueue('a', 'g') # [(a,g)]
q.enqueue('a', 'x') # [(a,x)]
self.assertEqual(q.dequeue(), 'a') # []
self.assertEqual(q.size(), 0)

Expand All @@ -122,18 +124,60 @@ def test_02_ag(self):
q.dequeue()


def test_03_agbh(self):
def test_03_axby(self):
q = ItalianQueue()
q.enqueue('a','g') # [(a,g)]
q.enqueue('b','h') # [(a,g), (b,h)]
q.enqueue('a','x') # [(a,x)]
q.enqueue('b','y') # [(a,x), (b,y)]

self.assertEqual(q.dequeue(), 'a') # [(b,h)]
self.assertEqual(q.dequeue(), 'a') # [(b,y)]
self.assertEqual(q.size(), 1)
self.assertEqual(q.top(), 'b')
self.assertEqual(q.top_group(), 'h')
self.assertEqual(q.top_group(), 'y')
self.assertEqual(q.tail(), 'b')
self.assertEqual(q.tail_group(), 'h')
self.assertEqual(q.tail_group(), 'y')

self.assertEqual(q.dequeue(), 'b') # []
self.assertEqual(q.size(), 0)



def test_04_axbxcydzez(self):
q = ItalianQueue()
q.enqueue('a','x')
q.enqueue('b','x')
q.enqueue('c','y')
q.enqueue('d','z')
q.enqueue('e','z') # [(a,x), (b,x), (c,y), (d,z), (e,z)]

self.assertEqual(q.dequeue(), 'a') # [(b,x), (c,y), (d,z), (e,z)]
self.assertEqual(q.size(), 4)
self.assertEqual(q.top(), 'b') #
self.assertEqual(q.top_group(), 'x')
self.assertEqual(q.tail(), 'e')
self.assertEqual(q.tail_group(), 'z')

self.assertEqual(q.dequeue(), 'b') # [(c,y), (d,z), (e,z)]
self.assertEqual(q.size(), 3)
self.assertEqual(q.top(), 'c')
self.assertEqual(q.top_group(), 'y')
self.assertEqual(q.tail(), 'e')
self.assertEqual(q.tail_group(), 'z')

self.assertEqual(q.dequeue(), 'c') # [(d,z), (e,z)]
self.assertEqual(q.size(), 2)
self.assertEqual(q.top(), 'd')
self.assertEqual(q.top_group(), 'z')
self.assertEqual(q.tail(), 'e')
self.assertEqual(q.tail_group(), 'z')

self.assertEqual(q.dequeue(), 'd') # [(e,z)]
self.assertEqual(q.size(), 1)
self.assertEqual(q.top(), 'e')
self.assertEqual(q.top_group(), 'z')
self.assertEqual(q.tail(), 'e')
self.assertEqual(q.tail_group(), 'z')

self.assertEqual(q.dequeue(), 'e') # []
self.assertEqual(q.size(), 0)



0 comments on commit da03e75

Please sign in to comment.