From 568e80888279d40c9354a5207dca04e85e345420 Mon Sep 17 00:00:00 2001 From: Himanshu Bhatnagar <33115688+Himan10@users.noreply.github.com> Date: Sat, 16 Nov 2019 19:34:09 +0530 Subject: [PATCH 1/9] Create circular_queue.py Circular Queue implementation using python list with fixed range. --- data_structures/queue/circular_queue.py | 41 +++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 data_structures/queue/circular_queue.py diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py new file mode 100644 index 000000000000..2324e8e8c6e1 --- /dev/null +++ b/data_structures/queue/circular_queue.py @@ -0,0 +1,41 @@ +# Implementation of Circular Queue (using python lists) + +class CircularQueue: + """ Circular queue with fixed capacity """ + + def __init__(self, n): + self.n = n + self.array = [None]*self.n + self.front = 0 # For first ele. Index + self.rear = 0 + self.size = 0 + + def __len__(self): + return self.size + + def is_empty(self): + return self.size == 0 + + def first(self): + if self.is_empty(): + return False + return self.array[self.front] + + def enqueue(self, data): + if self.size >= self.n: + raise "QUEUE IS FULL" + + self.array[self.rear] = data + self.rear = (self.rear+1)%self.n + self.size += 1 + return self + + def dequeue(self): + if self.size == 0: + raise "UNDERFLOW" + + temp = self.array[self.front] + self.array[self.front] = None + self.front = (self.front + 1)%self.n + self.size -= 1 + return temp From 2623809d82d9802a864bb488ce481df08f6dcb4f Mon Sep 17 00:00:00 2001 From: Himanshu Bhatnagar <33115688+Himan10@users.noreply.github.com> Date: Sat, 16 Nov 2019 23:45:49 +0530 Subject: [PATCH 2/9] Update circular_queue.py --- data_structures/queue/circular_queue.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index 2324e8e8c6e1..a4f2cb641b68 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -23,7 +23,7 @@ def first(self): def enqueue(self, data): if self.size >= self.n: - raise "QUEUE IS FULL" + return False self.array[self.rear] = data self.rear = (self.rear+1)%self.n @@ -32,7 +32,7 @@ def enqueue(self, data): def dequeue(self): if self.size == 0: - raise "UNDERFLOW" + return False temp = self.array[self.front] self.array[self.front] = None From 03d9b449a0358469100faf10c3aea3ae3d717c87 Mon Sep 17 00:00:00 2001 From: Himanshu Bhatnagar <33115688+Himan10@users.noreply.github.com> Date: Sun, 17 Nov 2019 13:01:52 +0530 Subject: [PATCH 3/9] Update circular_queue.py --- data_structures/queue/circular_queue.py | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index a4f2cb641b68..d1579eb96fbf 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -14,14 +14,41 @@ def __len__(self): return self.size def is_empty(self): + """ This function Return bool value of cond. self.size == 0 + >>> obj.is_empty() + True # Queue size >= 1 + >>> obj.is_empty() + False # Queue size < 1 + """ + return self.size == 0 def first(self): + """ + This function return the first element in the queue + >>> obj.first() # Queue -> [10, None, None, None, None] + 10 + >>> obj.first() + None # if queue is empty + """ + if self.is_empty(): return False return self.array[self.front] def enqueue(self, data): + """ + This function insert an element(data) at the end of the queue + >>> obj.enqueue(5) + return memory location of Class obj. + >>> obj.array + [5, None, None, None, None] + + # if Queue is full -> [5, 10, 15, 20, 25] + >>> obj.enqueue(30) + raise Exception + """ + if self.size >= self.n: return False @@ -31,6 +58,16 @@ def enqueue(self, data): return self def dequeue(self): + """ This function removes the first element of the queue. + Queue -> [5, None, None, None, None] + >>> obj.dequeue() + 5 + + # if Queue size is equal to 0 + >>> obj.dequeue() + raise Exception + """ + if self.size == 0: return False From b22bc33433919c2e2903a24264a2378cac38ebe1 Mon Sep 17 00:00:00 2001 From: Himanshu Bhatnagar <33115688+Himan10@users.noreply.github.com> Date: Sun, 17 Nov 2019 20:50:44 +0530 Subject: [PATCH 4/9] Update circular_queue.py --- data_structures/queue/circular_queue.py | 39 +++---------------------- 1 file changed, 4 insertions(+), 35 deletions(-) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index d1579eb96fbf..987718724ea8 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -14,40 +14,16 @@ def __len__(self): return self.size def is_empty(self): - """ This function Return bool value of cond. self.size == 0 - >>> obj.is_empty() - True # Queue size >= 1 - >>> obj.is_empty() - False # Queue size < 1 - """ - return self.size == 0 def first(self): - """ - This function return the first element in the queue - >>> obj.first() # Queue -> [10, None, None, None, None] - 10 - >>> obj.first() - None # if queue is empty - """ - if self.is_empty(): return False return self.array[self.front] def enqueue(self, data): - """ - This function insert an element(data) at the end of the queue - >>> obj.enqueue(5) - return memory location of Class obj. - >>> obj.array - [5, None, None, None, None] - - # if Queue is full -> [5, 10, 15, 20, 25] - >>> obj.enqueue(30) - raise Exception - """ + """ This function insert an element in the queue + using self.rear value as an index """ if self.size >= self.n: return False @@ -58,15 +34,8 @@ def enqueue(self, data): return self def dequeue(self): - """ This function removes the first element of the queue. - Queue -> [5, None, None, None, None] - >>> obj.dequeue() - 5 - - # if Queue size is equal to 0 - >>> obj.dequeue() - raise Exception - """ + """ This function removes an element from the queue + using on self.front value as an index """ if self.size == 0: return False From f7422d23af9ed6cb6805e8d93ac2b8385662e6ab Mon Sep 17 00:00:00 2001 From: Himanshu Bhatnagar <33115688+Himan10@users.noreply.github.com> Date: Sun, 17 Nov 2019 21:45:58 +0530 Subject: [PATCH 5/9] Update circular_queue.py --- data_structures/queue/circular_queue.py | 75 +++++++++++++++++++------ 1 file changed, 58 insertions(+), 17 deletions(-) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index 987718724ea8..a38a1426195f 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -1,32 +1,61 @@ -# Implementation of Circular Queue (using python lists) +# Implementation of Circular Queue (using Python lists) class CircularQueue: """ Circular queue with fixed capacity """ - def __init__(self, n): + def __init__(self, n: int): self.n = n - self.array = [None]*self.n - self.front = 0 # For first ele. Index + self.array = [None] * self.n + self.front = 0 # index of the first element self.rear = 0 self.size = 0 - def __len__(self): + def __len__(self) -> int: + """ + >>> cq = CircularQueue(5) + >>> len(cq) + 0 + >>> cq.enqueue("A") + >>> len(cq) + 1 + """ return self.size - def is_empty(self): + def is_empty(self) -> bool: + """ + >>> cq = CircularQueue(5) + >>> cq.is_empty() + True + >>> cq.enqueue("A") + >>> cq.is_empty() + False + """ return self.size == 0 def first(self): - if self.is_empty(): - return False - return self.array[self.front] + """ + >>> cq = CircularQueue(5) + >>> cq.first() + False + >>> cq.enqueue("A") + >>> cq.first() + 'A' + """ + return False if self.is_empty() else self.array[self.front] def enqueue(self, data): - """ This function insert an element in the queue - using self.rear value as an index """ - + """ + This function insert an element in the queue using self.rear value as an index + >>> cq = CircularQueue(5) + >>> cq.enqueue("A") + >>> (cq.size, cq.first(), cq.last()) + 1, 'A', 'A' + >>> cq.enqueue("B") + >>> (cq.size, cq.first(), cq.last()) + 2, 'A', 'B' + """ if self.size >= self.n: - return False + raise Exception("QUEUE IS FULL") self.array[self.rear] = data self.rear = (self.rear+1)%self.n @@ -34,11 +63,23 @@ def enqueue(self, data): return self def dequeue(self): - """ This function removes an element from the queue - using on self.front value as an index """ - + """ + This function removes an element from the queue using on self.front value as an + index + >>> cq = CircularQueue(5) + >>> cq.dequeue() + False + >>> cq.enqueue("A") + >>> cq.enqueue("B") + >>> cq.dequeue() + 'B' + >>> (cq.size, cq.first(), cq.last()) + 1, 'A', 'A' + >>> cq.dequeue() + False + """ if self.size == 0: - return False + raise Exception ("UNDERFLOW") temp = self.array[self.front] self.array[self.front] = None From 1b65ae165be2f7237e71657155e3491c89fc4dde Mon Sep 17 00:00:00 2001 From: Himanshu Bhatnagar <33115688+Himan10@users.noreply.github.com> Date: Sun, 17 Nov 2019 21:46:27 +0530 Subject: [PATCH 6/9] Update circular_queue.py --- data_structures/queue/circular_queue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index a38a1426195f..550a59c666eb 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -79,7 +79,7 @@ def dequeue(self): False """ if self.size == 0: - raise Exception ("UNDERFLOW") + raise Exception("UNDERFLOW") temp = self.array[self.front] self.array[self.front] = None From c8a38a863c18126a881ee8b16132673cd47d064a Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 17 Nov 2019 17:36:53 +0100 Subject: [PATCH 7/9] doctest: Catch "Exception: UNDERFLOW" --- data_structures/queue/circular_queue.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index 550a59c666eb..be7f809022d3 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -68,7 +68,9 @@ def dequeue(self): index >>> cq = CircularQueue(5) >>> cq.dequeue() - False + Traceback (most recent call last): + ... + Exception: UNDERFLOW >>> cq.enqueue("A") >>> cq.enqueue("B") >>> cq.dequeue() From 3390c5f62640ac3314d9f95089dc249e1c245018 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 17 Nov 2019 19:42:26 +0100 Subject: [PATCH 8/9] Deal with the fluent interface for cq.enqueue() --- data_structures/queue/circular_queue.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index be7f809022d3..daace51c8ebd 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -15,7 +15,8 @@ def __len__(self) -> int: >>> cq = CircularQueue(5) >>> len(cq) 0 - >>> cq.enqueue("A") + >>> cq.enqueue("A") # doctest: +ELLIPSIS + >> len(cq) 1 """ @@ -26,7 +27,8 @@ def is_empty(self) -> bool: >>> cq = CircularQueue(5) >>> cq.is_empty() True - >>> cq.enqueue("A") + >>> cq.enqueue("A") # doctest: +ELLIPSIS + >> cq.is_empty() False """ @@ -37,7 +39,8 @@ def first(self): >>> cq = CircularQueue(5) >>> cq.first() False - >>> cq.enqueue("A") + >>> cq.enqueue("A") # doctest: +ELLIPSIS + >> cq.first() 'A' """ @@ -47,10 +50,12 @@ def enqueue(self, data): """ This function insert an element in the queue using self.rear value as an index >>> cq = CircularQueue(5) - >>> cq.enqueue("A") + >>> cq.enqueue("A") # doctest: +ELLIPSIS + >> (cq.size, cq.first(), cq.last()) 1, 'A', 'A' - >>> cq.enqueue("B") + >>> cq.enqueue("B") # doctest: +ELLIPSIS + >> (cq.size, cq.first(), cq.last()) 2, 'A', 'B' """ @@ -71,8 +76,10 @@ def dequeue(self): Traceback (most recent call last): ... Exception: UNDERFLOW - >>> cq.enqueue("A") - >>> cq.enqueue("B") + >>> cq.enqueue("A") # doctest: +ELLIPSIS + >> cq.enqueue("B") # doctest: +ELLIPSIS + >> cq.dequeue() 'B' >>> (cq.size, cq.first(), cq.last()) From 643fc86ca4284ba9ab9855180779ad3329086a6f Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 17 Nov 2019 19:55:16 +0100 Subject: [PATCH 9/9] Test the fluent interface --- data_structures/queue/circular_queue.py | 32 +++++++++++-------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/data_structures/queue/circular_queue.py b/data_structures/queue/circular_queue.py index daace51c8ebd..2ba3f891e253 100644 --- a/data_structures/queue/circular_queue.py +++ b/data_structures/queue/circular_queue.py @@ -1,7 +1,7 @@ # Implementation of Circular Queue (using Python lists) class CircularQueue: - """ Circular queue with fixed capacity """ + """Circular FIFO queue with a fixed capacity""" def __init__(self, n: int): self.n = n @@ -27,9 +27,7 @@ def is_empty(self) -> bool: >>> cq = CircularQueue(5) >>> cq.is_empty() True - >>> cq.enqueue("A") # doctest: +ELLIPSIS - >> cq.is_empty() + >>> cq.enqueue("A").is_empty() False """ return self.size == 0 @@ -39,9 +37,7 @@ def first(self): >>> cq = CircularQueue(5) >>> cq.first() False - >>> cq.enqueue("A") # doctest: +ELLIPSIS - >> cq.first() + >>> cq.enqueue("A").first() 'A' """ return False if self.is_empty() else self.array[self.front] @@ -52,12 +48,12 @@ def enqueue(self, data): >>> cq = CircularQueue(5) >>> cq.enqueue("A") # doctest: +ELLIPSIS >> (cq.size, cq.first(), cq.last()) - 1, 'A', 'A' + >>> (cq.size, cq.first()) + (1, 'A') >>> cq.enqueue("B") # doctest: +ELLIPSIS >> (cq.size, cq.first(), cq.last()) - 2, 'A', 'B' + >>> (cq.size, cq.first()) + (2, 'A') """ if self.size >= self.n: raise Exception("QUEUE IS FULL") @@ -76,16 +72,16 @@ def dequeue(self): Traceback (most recent call last): ... Exception: UNDERFLOW - >>> cq.enqueue("A") # doctest: +ELLIPSIS - >> cq.enqueue("B") # doctest: +ELLIPSIS - >> cq.enqueue("A").enqueue("B").dequeue() + 'A' + >>> (cq.size, cq.first()) + (1, 'B') >>> cq.dequeue() 'B' - >>> (cq.size, cq.first(), cq.last()) - 1, 'A', 'A' >>> cq.dequeue() - False + Traceback (most recent call last): + ... + Exception: UNDERFLOW """ if self.size == 0: raise Exception("UNDERFLOW")