Skip to content

Commit f517caa

Browse files
authored
LinkedListQueue Added (#127)
1 parent 3e6e861 commit f517caa

File tree

2 files changed

+85
-9
lines changed

2 files changed

+85
-9
lines changed

pydatastructs/miscellaneous_data_structures/queue.py

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from pydatastructs.linear_data_structures import DynamicOneDimensionalArray
2-
from pydatastructs.utils.misc_util import NoneType
1+
from pydatastructs.linear_data_structures import DynamicOneDimensionalArray, SinglyLinkedList
2+
from pydatastructs.utils.misc_util import NoneType, LinkedListNode
33
from copy import deepcopy as dc
44

55
__all__ = [
@@ -15,17 +15,12 @@ class Queue(object):
1515
implementation : str
1616
Implementation to be used for queue.
1717
By default, 'array'
18-
Currently only supports 'array'
19-
implementation.
2018
items : list/tuple
2119
Optional, by default, None
2220
The inital items in the queue.
23-
For array implementation.
2421
dtype : A valid python type
2522
Optional, by default NoneType if item
26-
is None, otherwise takes the data
27-
type of DynamicOneDimensionalArray
28-
For array implementation.
23+
is None.
2924
3025
Examples
3126
========
@@ -51,6 +46,11 @@ def __new__(cls, implementation='array', **kwargs):
5146
return ArrayQueue(
5247
kwargs.get('items', None),
5348
kwargs.get('dtype', int))
49+
elif implementation == 'linkedlist':
50+
return LinkedListQueue(
51+
kwargs.get('items', None),
52+
kwargs.get('dtype', NoneType)
53+
)
5454
raise NotImplementedError(
5555
"%s hasn't been implemented yet."%(implementation))
5656

@@ -64,7 +64,9 @@ def popleft(self, *args, **kwargs):
6464

6565
@property
6666
def is_empty(self):
67-
return None
67+
raise NotImplementedError(
68+
"This is an abstract method.")
69+
6870

6971
class ArrayQueue(Queue):
7072

@@ -122,3 +124,59 @@ def __str__(self):
122124
for i in range(self.front, self.rear + 1):
123125
_data.append(self.items._data[i])
124126
return str(_data)
127+
128+
129+
class LinkedListQueue(Queue):
130+
131+
__slots__ = ['front', 'rear', 'size', '_dtype']
132+
133+
def __new__(cls, items=None, dtype=NoneType):
134+
obj = object.__new__(cls)
135+
obj.queue = SinglyLinkedList()
136+
obj._dtype = dtype
137+
if items is None:
138+
pass
139+
elif type(items) in (list, tuple):
140+
if len(items) != 0 and dtype is NoneType:
141+
obj._dtype = type(items[0])
142+
for x in items:
143+
if type(x) == obj._dtype:
144+
obj.queue.append(x)
145+
else:
146+
raise TypeError("Expected %s but got %s"%(obj._dtype, type(x)))
147+
else:
148+
raise TypeError("Expected type: list/tuple")
149+
obj.front = obj.queue.head
150+
obj.rear = obj.queue.tail
151+
obj.size = obj.queue.size
152+
return obj
153+
154+
def append(self, x):
155+
if self._dtype is NoneType:
156+
self._dtype = type(x)
157+
elif type(x) is not self._dtype:
158+
raise TypeError("Expected %s but got %s"%(self._dtype, type(x)))
159+
self.size += 1
160+
self.queue.append(x)
161+
if self.front is None:
162+
self.front = self.queue.head
163+
self.rear = self.queue.tail
164+
165+
def popleft(self):
166+
if self.is_empty:
167+
raise ValueError("Queue is empty.")
168+
self.size -= 1
169+
return_value = self.queue.pop_left()
170+
self.front = self.queue.head
171+
self.rear = self.queue.tail
172+
return return_value
173+
174+
@property
175+
def is_empty(self):
176+
return self.size == 0
177+
178+
def __len__(self):
179+
return self.size
180+
181+
def __str__(self):
182+
return str(self.queue)

pydatastructs/miscellaneous_data_structures/tests/test_queue.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,21 @@ def test_Queue():
1818

1919
q1 = Queue()
2020
raises(ValueError, lambda: q1.popleft())
21+
22+
q1 = Queue(implementation='linkedlist')
23+
q1.append(1)
24+
assert raises(TypeError, lambda: q1.append('a'))
25+
assert raises(TypeError, lambda: Queue(implementation='linkedlist', items=[0], dtype=str))
26+
assert raises(TypeError, lambda: Queue(implementation='linkedlist', items={0, 1}))
27+
q1 = Queue(implementation='linkedlist', items = [0, 1])
28+
q1.append(2)
29+
q1.append(3)
30+
assert str(q1) == '[0, 1, 2, 3]'
31+
assert len(q1) == 4
32+
assert q1.popleft().data == 0
33+
assert q1.popleft().data == 1
34+
assert len(q1) == 2
35+
assert q1.popleft().data == 2
36+
assert q1.popleft().data == 3
37+
assert len(q1) == 0
38+
raises(ValueError, lambda: q1.popleft())

0 commit comments

Comments
 (0)