Skip to content

Commit 23c9e91

Browse files
Saptashrungiczgdp1807
authored andcommitted
Using DynamicOneDimensionalArray in ArrayStack (#69)
API for Stack has been changed, and updates have been made accordingly at various places in the package.
1 parent b2e3900 commit 23c9e91

File tree

3 files changed

+30
-53
lines changed

3 files changed

+30
-53
lines changed

pydatastructs/miscellaneous_data_structures/stack.py

Lines changed: 20 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pydatastructs.linear_data_structures import OneDimensionalArray
1+
from pydatastructs.linear_data_structures import DynamicOneDimensionalArray
22
from copy import deepcopy as dc
33

44
__all__ = [
@@ -19,13 +19,7 @@ class Stack(object):
1919
By default, 'array'
2020
Currently only supports 'array'
2121
implementation.
22-
maxsize : int
23-
The maximum size of the stack.
24-
For array implementation.
25-
top : int
26-
The top element of the stack.
27-
For array implementation.
28-
items : OneDimensionalArray
22+
items : DynamicOneDimensionalArray
2923
Optional, by default, None
3024
The inital items in the stack.
3125
For array implementation.
@@ -39,12 +33,12 @@ class Stack(object):
3933
=======
4034
4135
>>> from pydatastructs import Stack
42-
>>> s = Stack(maxsize=5, top=0)
36+
>>> s = Stack()
4337
>>> s.push(1)
4438
>>> s.push(2)
4539
>>> s.push(3)
4640
>>> str(s)
47-
'[1, 2, 3, None, None]'
41+
'[1, 2, 3]'
4842
>>> s.pop()
4943
3
5044
@@ -57,8 +51,6 @@ class Stack(object):
5751
def __new__(cls, implementation='array', **kwargs):
5852
if implementation == 'array':
5953
return ArrayStack(
60-
kwargs.get('maxsize', None),
61-
kwargs.get('top', 0),
6254
kwargs.get('items', None),
6355
kwargs.get('dtype', int))
6456
raise NotImplementedError(
@@ -82,46 +74,36 @@ def peek(self):
8274

8375
class ArrayStack(Stack):
8476

85-
__slots__ = ['maxsize', 'top', 'items', 'dtype']
77+
__slots__ = ['items', 'dtype']
8678

87-
def __new__(cls, maxsize=None, top=0, items=None, dtype=int):
88-
if not _check_type(maxsize, int):
89-
raise ValueError("maxsize is missing.")
90-
if not _check_type(top, int):
91-
raise TypeError("top is not of type int.")
79+
def __new__(cls, items=None, dtype=int):
9280
if items is None:
93-
items = OneDimensionalArray(dtype, maxsize)
94-
if not _check_type(items, OneDimensionalArray):
95-
raise ValueError("items is not of type, OneDimensionalArray")
96-
if items._size > maxsize:
97-
raise ValueError("Overflow, size of items %s is greater "
98-
"than maxsize, %s"%(items._size, maxsize))
81+
items = DynamicOneDimensionalArray(dtype, 0)
82+
else:
83+
items = DynamicOneDimensionalArray(dtype, items)
9984
obj = object.__new__(cls)
100-
obj.maxsize, obj.top, obj.items, obj.dtype = \
101-
maxsize, top, items, items._dtype
85+
obj.items, obj.dtype = \
86+
items, items._dtype
10287
return obj
10388

10489
def push(self, x):
105-
if self.top == self.maxsize:
106-
raise ValueError("Stack is full.")
107-
self.items[self.top] = self.dtype(x)
108-
self.top += 1
90+
self.items.append(x)
10991

11092
def pop(self):
111-
if self.top == 0:
112-
raise ValueError("Stack is already empty.")
113-
self.top -= 1
114-
r = self.items[self.top]
115-
self.items[self.top] = None
116-
return r
93+
if self.is_empty:
94+
raise ValueError("Stack is empty")
95+
96+
top_element = dc(self.items[self.items._last_pos_filled])
97+
self.items.delete(self.items._last_pos_filled)
98+
return top_element
11799

118100
@property
119101
def is_empty(self):
120-
return self.top == 0
102+
return self.items._last_pos_filled == -1
121103

122104
@property
123105
def peek(self):
124-
return self.items[self.top - 1]
106+
return self.items[self.items._last_pos_filled]
125107

126108
def __str__(self):
127109
"""

pydatastructs/miscellaneous_data_structures/tests/test_stack.py

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,17 @@
44

55
def test_Stack():
66

7-
s = Stack(maxsize=3, top=0)
7+
s = Stack()
88
s.push(1)
99
s.push(2)
1010
s.push(3)
11-
assert s.top == 3
11+
assert s.peek == 3
1212
assert str(s) == '[1, 2, 3]'
13-
assert raises(ValueError, lambda: s.push(4))
1413
assert s.pop() == 3
1514
assert s.pop() == 2
1615
assert s.pop() == 1
17-
assert s.top == 0
18-
assert raises(ValueError, lambda: s.pop())
19-
assert raises(ValueError, lambda: Stack())
20-
assert raises(TypeError, lambda: Stack(maxsize=8, top=3.5))
21-
assert raises(ValueError, lambda: Stack(maxsize=5, top=0, items=[1, 2, 3]))
22-
assert raises(ValueError, lambda: Stack(maxsize=5, top=0,
23-
items=OneDimensionalArray(int, 6)))
24-
assert raises(NotImplementedError, lambda: Stack(implementation='',
25-
maxsize=5, top=0))
16+
assert s.is_empty is True
17+
assert raises(ValueError, lambda : s.pop())
18+
_s = Stack(items=[1, 2, 3])
19+
assert str(_s) == '[1, 2, 3]'
20+
assert raises(NotImplementedError, lambda: Stack(implementation=''))

pydatastructs/trees/binary_trees.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ def _pre_order(self, node):
653653
"""
654654
visit = []
655655
tree, size = self.tree.tree, self.tree.size
656-
s = Stack(maxsize=size)
656+
s = Stack()
657657
s.push(node)
658658
while not s.is_empty:
659659
node = s.pop()
@@ -671,7 +671,7 @@ def _in_order(self, node):
671671
"""
672672
visit = []
673673
tree, size = self.tree.tree, self.tree.size
674-
s = Stack(maxsize=size)
674+
s = Stack()
675675
while not s.is_empty or node is not None:
676676
if node is not None:
677677
s.push(node)
@@ -689,7 +689,7 @@ def _post_order(self, node):
689689
"""
690690
visit = []
691691
tree, size = self.tree.tree, self.tree.size
692-
s = Stack(maxsize=size)
692+
s = Stack()
693693
s.push(node)
694694
last = OneDimensionalArray(int, size)
695695
last.fill(False)

0 commit comments

Comments
 (0)