Skip to content

Commit 34a2eaf

Browse files
Restructured queue.py and stack.py (#152)
1 parent b0c3136 commit 34a2eaf

File tree

4 files changed

+126
-41
lines changed

4 files changed

+126
-41
lines changed

pydatastructs/miscellaneous_data_structures/queue.py

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

55
__all__ = [
@@ -46,10 +46,9 @@ def __new__(cls, implementation='array', **kwargs):
4646
return ArrayQueue(
4747
kwargs.get('items', None),
4848
kwargs.get('dtype', int))
49-
elif implementation == 'linkedlist':
49+
elif implementation == 'linked_list':
5050
return LinkedListQueue(
51-
kwargs.get('items', None),
52-
kwargs.get('dtype', NoneType)
51+
kwargs.get('items', None)
5352
)
5453
raise NotImplementedError(
5554
"%s hasn't been implemented yet."%(implementation))
@@ -94,7 +93,7 @@ def append(self, x):
9493

9594
def popleft(self):
9695
if self.is_empty:
97-
raise ValueError("Queue is empty.")
96+
raise IndexError("Queue is empty.")
9897
return_value = dc(self.items[self.front])
9998
front_temp = self.front
10099
if self.front == self.rear:
@@ -128,53 +127,45 @@ def __str__(self):
128127

129128
class LinkedListQueue(Queue):
130129

131-
__slots__ = ['front', 'rear', 'size', '_dtype']
130+
__slots__ = ['queue']
132131

133-
def __new__(cls, items=None, dtype=NoneType):
132+
def __new__(cls, items=None):
134133
obj = object.__new__(cls)
135134
obj.queue = SinglyLinkedList()
136-
obj._dtype = dtype
137135
if items is None:
138136
pass
139137
elif type(items) in (list, tuple):
140-
if len(items) != 0 and dtype is NoneType:
141-
obj._dtype = type(items[0])
142138
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)))
139+
obj.append(x)
147140
else:
148141
raise TypeError("Expected type: list/tuple")
149-
obj.front = obj.queue.head
150-
obj.rear = obj.queue.tail
151-
obj.size = obj.queue.size
152142
return obj
153143

154144
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
160145
self.queue.append(x)
161-
if self.front is None:
162-
self.front = self.queue.head
163-
self.rear = self.queue.tail
164146

165147
def popleft(self):
166148
if self.is_empty:
167-
raise ValueError("Queue is empty.")
168-
self.size -= 1
149+
raise IndexError("Queue is empty.")
169150
return_value = self.queue.pop_left()
170-
self.front = self.queue.head
171-
self.rear = self.queue.tail
172151
return return_value
173152

174153
@property
175154
def is_empty(self):
176155
return self.size == 0
177156

157+
@property
158+
def front(self):
159+
return self.queue.head
160+
161+
@property
162+
def rear(self):
163+
return self.queue.tail
164+
165+
@property
166+
def size(self):
167+
return self.queue.size
168+
178169
def __len__(self):
179170
return self.size
180171

pydatastructs/miscellaneous_data_structures/stack.py

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pydatastructs.linear_data_structures import DynamicOneDimensionalArray
1+
from pydatastructs.linear_data_structures import DynamicOneDimensionalArray, SinglyLinkedList
22
from pydatastructs.utils.misc_util import _check_type, NoneType
33
from copy import deepcopy as dc
44

@@ -51,6 +51,10 @@ def __new__(cls, implementation='array', **kwargs):
5151
return ArrayStack(
5252
kwargs.get('items', None),
5353
kwargs.get('dtype', int))
54+
if implementation == 'linked_list':
55+
return LinkedListStack(
56+
kwargs.get('items',None)
57+
)
5458
raise NotImplementedError(
5559
"%s hasn't been implemented yet."%(implementation))
5660

@@ -64,11 +68,13 @@ def pop(self, *args, **kwargs):
6468

6569
@property
6670
def is_empty(self):
67-
return None
71+
raise NotImplementedError(
72+
"This is an abstract method.")
6873

6974
@property
7075
def peek(self):
71-
return None
76+
raise NotImplementedError(
77+
"This is an abstract method.")
7278

7379
class ArrayStack(Stack):
7480

@@ -90,7 +96,7 @@ def push(self, x):
9096

9197
def pop(self):
9298
if self.is_empty:
93-
raise ValueError("Stack is empty")
99+
raise IndexError("Stack is empty")
94100

95101
top_element = dc(self.items[self.items._last_pos_filled])
96102
self.items.delete(self.items._last_pos_filled)
@@ -104,8 +110,58 @@ def is_empty(self):
104110
def peek(self):
105111
return self.items[self.items._last_pos_filled]
106112

113+
def __len__(self):
114+
return self.items._num
115+
107116
def __str__(self):
108117
"""
109118
Used for printing.
110119
"""
111120
return str(self.items._data)
121+
122+
123+
class LinkedListStack(Stack):
124+
125+
__slots__ = ['stack']
126+
127+
def __new__(cls, items=None):
128+
obj = object.__new__(cls)
129+
obj.stack = SinglyLinkedList()
130+
if items is None:
131+
pass
132+
elif type(items) in (list, tuple):
133+
for x in items:
134+
obj.push(x)
135+
else:
136+
raise TypeError("Expected type: list/tuple")
137+
return obj
138+
139+
def push(self, x):
140+
self.stack.append_left(x)
141+
142+
def pop(self):
143+
if self.is_empty:
144+
raise IndexError("Stack is empty")
145+
return self.stack.pop_left()
146+
147+
@property
148+
def is_empty(self):
149+
return self.__len__() == 0
150+
151+
@property
152+
def peek(self):
153+
return self.top.data
154+
155+
@property
156+
def top(self):
157+
return self.stack.head
158+
159+
@property
160+
def size(self):
161+
return self.stack.size
162+
163+
def __len__(self):
164+
return self.stack.size
165+
166+
def __str__(self):
167+
return str(self.stack)

pydatastructs/miscellaneous_data_structures/tests/test_queue.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@ def test_Queue():
1717
assert len(q1) == 0
1818

1919
q1 = Queue()
20-
raises(ValueError, lambda: q1.popleft())
20+
raises(IndexError, lambda: q1.popleft())
2121

22-
q1 = Queue(implementation='linkedlist')
22+
q1 = Queue(implementation='linked_list')
2323
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])
24+
assert raises(TypeError, lambda: Queue(implementation='linked_list', items={0, 1}))
25+
q1 = Queue(implementation='linked_list', items = [0, 1])
2826
q1.append(2)
2927
q1.append(3)
3028
assert str(q1) == '[0, 1, 2, 3]'
@@ -35,4 +33,17 @@ def test_Queue():
3533
assert q1.popleft().data == 2
3634
assert q1.popleft().data == 3
3735
assert len(q1) == 0
38-
raises(ValueError, lambda: q1.popleft())
36+
raises(IndexError, lambda: q1.popleft())
37+
38+
q1 = Queue(implementation='linked_list',items=['a',None,type,{}])
39+
assert len(q1) == 4
40+
assert q1.size == 4
41+
42+
front = q1.front
43+
assert front.data == q1.popleft().data
44+
45+
rear = q1.rear
46+
for _ in range(len(q1)-1):
47+
q1.popleft()
48+
49+
assert rear.data == q1.popleft().data

pydatastructs/miscellaneous_data_structures/tests/test_stack.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,34 @@ def test_Stack():
1414
assert s.pop() == 2
1515
assert s.pop() == 1
1616
assert s.is_empty is True
17-
assert raises(ValueError, lambda : s.pop())
17+
assert raises(IndexError, lambda : s.pop())
1818
_s = Stack(items=[1, 2, 3])
1919
assert str(_s) == '[1, 2, 3]'
20+
assert len(_s) == 3
2021
assert raises(NotImplementedError, lambda: Stack(implementation=''))
22+
23+
s = Stack(implementation='linked_list')
24+
s.push(1)
25+
s.push(2)
26+
s.push(3)
27+
assert s.peek == 3
28+
assert str(s) == '[3, 2, 1]'
29+
assert s.pop().data == 3
30+
assert s.pop().data == 2
31+
assert s.pop().data == 1
32+
assert s.is_empty is True
33+
assert raises(IndexError, lambda : s.pop())
34+
_s = Stack(implementation='linked_list',items=[1, 2, 3])
35+
assert str(_s) == '[3, 2, 1]'
36+
assert len(_s) == 3
37+
38+
s = Stack(implementation='linked_list',items=['a',None,type,{}])
39+
assert len(s) == 4
40+
assert s.size == 4
41+
42+
top = s.top
43+
assert top.data == s.pop().data
44+
45+
peek = s.peek
46+
assert peek == s.pop().data
47+
assert raises(TypeError, lambda: Stack(implementation='linked_list', items={0, 1}))

0 commit comments

Comments
 (0)