From 1917dcc5be5448e41c90ddebeb7cfd1c19340254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 17 Oct 2021 16:49:33 -0300 Subject: [PATCH 01/13] CircularQueueLinkedList: empty list, trivial implementation TheAlgorithms#5361 --- .../queue/circular_queue_linked_list.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 data_structures/queue/circular_queue_linked_list.py diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py new file mode 100644 index 000000000000..958785ac2209 --- /dev/null +++ b/data_structures/queue/circular_queue_linked_list.py @@ -0,0 +1,38 @@ +class CircularQueueLinkedList: + def is_empty(self) -> bool: + """ + >>> cq = CircularQueueLinkedList() + >>> cq.is_empty() + True + """ + return True + + def first(self): + """ + >>> cq = CircularQueueLinkedList() + >>> cq.first() + Traceback (most recent call last): + ... + Exception: Empty Queue + """ + raise Exception("Empty Queue") + + def enqueue(self, data): + pass + + def dequeue(self): + """ + >>> cq = CircularQueueLinkedList() + >>> cq.dequeue() + Traceback (most recent call last): + ... + Exception: Empty Queue + """ + + raise Exception("Empty Queue") + + +if __name__ == "__main__": + import doctest + + doctest.testmod() From daec8737c5b628db69b9ebe5e6808f181cf24839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 17 Oct 2021 18:48:42 -0300 Subject: [PATCH 02/13] CircularQueueLinkedList: single element list TheAlgorithms#5361 --- .../queue/circular_queue_linked_list.py | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index 958785ac2209..7c564c336062 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,11 +1,22 @@ class CircularQueueLinkedList: + def __init__(self): + self.is_empty_queue = True + self.elem = None + def is_empty(self) -> bool: """ >>> cq = CircularQueueLinkedList() >>> cq.is_empty() True + >>> cq.enqueue('a') + >>> cq.is_empty() + False + >>> cq.dequeue() + 'a' + >>> cq.is_empty() + True """ - return True + return self.is_empty_queue def first(self): """ @@ -14,11 +25,24 @@ def first(self): Traceback (most recent call last): ... Exception: Empty Queue + >>> cq.enqueue('a') + >>> cq.first() + 'a' + >>> cq.dequeue() + 'a' + >>> cq.first() + Traceback (most recent call last): + ... + Exception: Empty Queue """ - raise Exception("Empty Queue") + if self.elem is None: + raise Exception("Empty Queue") + + return self.elem def enqueue(self, data): - pass + self.is_empty_queue = False + self.elem = data def dequeue(self): """ @@ -27,9 +51,21 @@ def dequeue(self): Traceback (most recent call last): ... Exception: Empty Queue + >>> cq.enqueue('a') + >>> cq.dequeue() + 'a' + >>> cq.dequeue() + Traceback (most recent call last): + ... + Exception: Empty Queue """ + if self.elem is None: + raise Exception("Empty Queue") - raise Exception("Empty Queue") + self.is_empty_queue = True + elem = self.elem + self.elem = None + return elem if __name__ == "__main__": From 6259697fbe367b5f531410ca9a7e59e7a94a251b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 17 Oct 2021 18:50:16 -0300 Subject: [PATCH 03/13] CircularQueueLinkedList: refactor, no que empty attribute TheAlgorithms#5361 --- data_structures/queue/circular_queue_linked_list.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index 7c564c336062..5b2f190c6540 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,6 +1,5 @@ class CircularQueueLinkedList: def __init__(self): - self.is_empty_queue = True self.elem = None def is_empty(self) -> bool: @@ -16,7 +15,7 @@ def is_empty(self) -> bool: >>> cq.is_empty() True """ - return self.is_empty_queue + return self.elem is None def first(self): """ @@ -41,7 +40,6 @@ def first(self): return self.elem def enqueue(self, data): - self.is_empty_queue = False self.elem = data def dequeue(self): @@ -62,7 +60,6 @@ def dequeue(self): if self.elem is None: raise Exception("Empty Queue") - self.is_empty_queue = True elem = self.elem self.elem = None return elem From 7fb8973f9434ccb6a4e72ded380c7183e303cf09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 17 Oct 2021 20:09:15 -0300 Subject: [PATCH 04/13] CircularQueueLinkedList: refactor TheAlgorithms#5361 --- data_structures/queue/circular_queue_linked_list.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index 5b2f190c6540..af25612ed5d4 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -34,9 +34,7 @@ def first(self): ... Exception: Empty Queue """ - if self.elem is None: - raise Exception("Empty Queue") - + self.check_can_perform_operation() return self.elem def enqueue(self, data): @@ -57,13 +55,15 @@ def dequeue(self): ... Exception: Empty Queue """ - if self.elem is None: - raise Exception("Empty Queue") - + self.check_can_perform_operation() elem = self.elem self.elem = None return elem + def check_can_perform_operation(self): + if self.elem is None: + raise Exception("Empty Queue") + if __name__ == "__main__": import doctest From 8f76f46d66684af8a362356943f0b1275cb9d11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sat, 23 Oct 2021 16:40:26 -0300 Subject: [PATCH 05/13] CircularQueueLinkedList: changed internal data structure to use double linked list TheAlgorithms#5361 --- .../queue/circular_queue_linked_list.py | 49 ++++++++++++++++--- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index af25612ed5d4..1b5f3d91faa0 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,6 +1,21 @@ class CircularQueueLinkedList: def __init__(self): - self.elem = None + self.front = None + self.rear = None + self.create_linked_list() + + def create_linked_list(self): + current_node = Node() + self.front = current_node + self.rear = current_node + previous_node = current_node + for i in range(6): + current_node = Node() + previous_node.next = current_node + current_node.prev = previous_node + previous_node = current_node + previous_node.next = self.front + self.front.prev = previous_node def is_empty(self) -> bool: """ @@ -15,7 +30,7 @@ def is_empty(self) -> bool: >>> cq.is_empty() True """ - return self.elem is None + return self.front == self.rear and self.front.data is None def first(self): """ @@ -35,10 +50,14 @@ def first(self): Exception: Empty Queue """ self.check_can_perform_operation() - return self.elem + return self.front.data def enqueue(self, data): - self.elem = data + if self.is_empty(): + self.rear.data = data + else: + self.rear = self.rear.next + self.rear.data = data def dequeue(self): """ @@ -56,15 +75,29 @@ def dequeue(self): Exception: Empty Queue """ self.check_can_perform_operation() - elem = self.elem - self.elem = None - return elem + if self.front == self.rear: + data = self.front.data + self.front.data = None + return data + + old_front = self.front + self.front = old_front.next + data = old_front.data + old_front.data = None + return data def check_can_perform_operation(self): - if self.elem is None: + if self.is_empty(): raise Exception("Empty Queue") +class Node: + def __init__(self): + self.data = None + self.next = None + self.prev = None + + if __name__ == "__main__": import doctest From b3abd071de268c738d06bbfd0ca732aadbb9641e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sat, 23 Oct 2021 16:43:50 -0300 Subject: [PATCH 06/13] CircularQueueLinkedList: enqueue test cases added TheAlgorithms#5361 --- .../queue/circular_queue_linked_list.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index 1b5f3d91faa0..ba0111c22e58 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -53,6 +53,20 @@ def first(self): return self.front.data def enqueue(self, data): + + """ + >>> cq = CircularQueueLinkedList() + >>> cq.enqueue('a') + >>> cq.enqueue('b') + >>> cq.dequeue() + 'a' + >>> cq.dequeue() + 'b' + >>> cq.dequeue() + Traceback (most recent call last): + ... + Exception: Empty Queue + """ if self.is_empty(): self.rear.data = data else: From ae12cab34600be82333bbd16e71bff2c41b5f859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sat, 23 Oct 2021 16:55:42 -0300 Subject: [PATCH 07/13] CircularQueueLinkedList: track full queue TheAlgorithms#5361 --- .../queue/circular_queue_linked_list.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index ba0111c22e58..f10628605507 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,15 +1,25 @@ class CircularQueueLinkedList: - def __init__(self): + """ + >>> cq = CircularQueueLinkedList(2) + >>> cq.enqueue('a') + >>> cq.enqueue('b') + >>> cq.enqueue('c') + Traceback (most recent call last): + ... + Exception: Full Queue + """ + + def __init__(self, initial_capacity=6): self.front = None self.rear = None - self.create_linked_list() + self.create_linked_list(initial_capacity) - def create_linked_list(self): + def create_linked_list(self, initial_capacity): current_node = Node() self.front = current_node self.rear = current_node previous_node = current_node - for i in range(6): + for i in range(1, initial_capacity): current_node = Node() previous_node.next = current_node current_node.prev = previous_node @@ -67,6 +77,7 @@ def enqueue(self, data): ... Exception: Empty Queue """ + self.check_is_full() if self.is_empty(): self.rear.data = data else: @@ -104,6 +115,10 @@ def check_can_perform_operation(self): if self.is_empty(): raise Exception("Empty Queue") + def check_is_full(self): + if self.rear.next == self.front: + raise Exception("Full Queue") + class Node: def __init__(self): From 77f3237e5d18505f6730afec0290a83d5932dc9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sat, 23 Oct 2021 17:09:06 -0300 Subject: [PATCH 08/13] CircularQueueLinkedList: adding functions description TheAlgorithms#5361 --- .../queue/circular_queue_linked_list.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index f10628605507..ac8ad0303473 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,5 +1,10 @@ +# Implementation of Circular Queue using linked lists + + class CircularQueueLinkedList: """ + Circular FIFO list with the given capacity (default queue length : 6) + >>> cq = CircularQueueLinkedList(2) >>> cq.enqueue('a') >>> cq.enqueue('b') @@ -29,6 +34,7 @@ def create_linked_list(self, initial_capacity): def is_empty(self) -> bool: """ + Checks where the queue is empty or not >>> cq = CircularQueueLinkedList() >>> cq.is_empty() True @@ -44,6 +50,7 @@ def is_empty(self) -> bool: def first(self): """ + Returns the first element of the queue >>> cq = CircularQueueLinkedList() >>> cq.first() Traceback (most recent call last): @@ -58,13 +65,18 @@ def first(self): Traceback (most recent call last): ... Exception: Empty Queue + >>> cq.enqueue('b') + >>> cq.enqueue('c') + >>> cq.first() + 'b' """ self.check_can_perform_operation() return self.front.data def enqueue(self, data): - """ + Saves data at the end of the queue + >>> cq = CircularQueueLinkedList() >>> cq.enqueue('a') >>> cq.enqueue('b') @@ -86,6 +98,8 @@ def enqueue(self, data): def dequeue(self): """ + Removes and retrieves the first element of the queue + >>> cq = CircularQueueLinkedList() >>> cq.dequeue() Traceback (most recent call last): From 46e0d0bfd55c1e2fe27ad03fb050a57de43e28c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 24 Oct 2021 19:36:33 -0300 Subject: [PATCH 09/13] CircularQueueLinkedList: type hints TheAlgorithms#5361 --- data_structures/queue/circular_queue_linked_list.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index ac8ad0303473..fe7f8c3dbf52 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,4 +1,5 @@ # Implementation of Circular Queue using linked lists +from typing import Any class CircularQueueLinkedList: @@ -14,7 +15,7 @@ class CircularQueueLinkedList: Exception: Full Queue """ - def __init__(self, initial_capacity=6): + def __init__(self, initial_capacity: int = 6): self.front = None self.rear = None self.create_linked_list(initial_capacity) @@ -48,7 +49,7 @@ def is_empty(self) -> bool: """ return self.front == self.rear and self.front.data is None - def first(self): + def first(self) -> Any: """ Returns the first element of the queue >>> cq = CircularQueueLinkedList() @@ -73,7 +74,7 @@ def first(self): self.check_can_perform_operation() return self.front.data - def enqueue(self, data): + def enqueue(self, data: Any): """ Saves data at the end of the queue @@ -96,7 +97,7 @@ def enqueue(self, data): self.rear = self.rear.next self.rear.data = data - def dequeue(self): + def dequeue(self) -> Any: """ Removes and retrieves the first element of the queue From 2a07f99e9e50bdc55ee4199b7e2adc0196cda5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 24 Oct 2021 19:38:42 -0300 Subject: [PATCH 10/13] CircularQueueLinkedList: algorithm explanation TheAlgorithms#5361 --- data_structures/queue/circular_queue_linked_list.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index fe7f8c3dbf52..8df41712a2bf 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,4 +1,6 @@ -# Implementation of Circular Queue using linked lists +# Implementation of Circular Queue using linked lists\ +# https://en.wikipedia.org/wiki/Circular_buffer + from typing import Any From 4d8d8c846d3b14ba76d733d145e879d851a8d0f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 24 Oct 2021 19:50:45 -0300 Subject: [PATCH 11/13] CircularQueueLinkedList: missing type hints TheAlgorithms#5361 --- data_structures/queue/circular_queue_linked_list.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index 8df41712a2bf..df341fd83cbe 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -17,12 +17,12 @@ class CircularQueueLinkedList: Exception: Full Queue """ - def __init__(self, initial_capacity: int = 6): + def __init__(self, initial_capacity: int = 6) -> None: self.front = None self.rear = None self.create_linked_list(initial_capacity) - def create_linked_list(self, initial_capacity): + def create_linked_list(self, initial_capacity) -> None: current_node = Node() self.front = current_node self.rear = current_node @@ -76,7 +76,7 @@ def first(self) -> Any: self.check_can_perform_operation() return self.front.data - def enqueue(self, data: Any): + def enqueue(self, data: Any) -> None: """ Saves data at the end of the queue @@ -128,17 +128,17 @@ def dequeue(self) -> Any: old_front.data = None return data - def check_can_perform_operation(self): + def check_can_perform_operation(self) -> None: if self.is_empty(): raise Exception("Empty Queue") - def check_is_full(self): + def check_is_full(self) -> None: if self.rear.next == self.front: raise Exception("Full Queue") class Node: - def __init__(self): + def __init__(self) -> None: self.data = None self.next = None self.prev = None From 0cd8d029315194056b5d503aebe0c5f486b67341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20=28Bit-Man=29=20Rodr=C3=ADguez?= Date: Sun, 24 Oct 2021 19:52:30 -0300 Subject: [PATCH 12/13] CircularQueueLinkedList: more missing type hints TheAlgorithms#5361 --- data_structures/queue/circular_queue_linked_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index df341fd83cbe..766bb020c16a 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -22,7 +22,7 @@ def __init__(self, initial_capacity: int = 6) -> None: self.rear = None self.create_linked_list(initial_capacity) - def create_linked_list(self, initial_capacity) -> None: + def create_linked_list(self, initial_capacity: int) -> None: current_node = Node() self.front = current_node self.rear = current_node From 39ae28b35c3482954387b6d53cc11e05a3bbe8aa Mon Sep 17 00:00:00 2001 From: John Law Date: Thu, 28 Oct 2021 22:22:23 +0800 Subject: [PATCH 13/13] Update data_structures/queue/circular_queue_linked_list.py --- data_structures/queue/circular_queue_linked_list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/queue/circular_queue_linked_list.py b/data_structures/queue/circular_queue_linked_list.py index 766bb020c16a..1878403bd2ef 100644 --- a/data_structures/queue/circular_queue_linked_list.py +++ b/data_structures/queue/circular_queue_linked_list.py @@ -1,4 +1,4 @@ -# Implementation of Circular Queue using linked lists\ +# Implementation of Circular Queue using linked lists # https://en.wikipedia.org/wiki/Circular_buffer from typing import Any