forked from keon/algorithms
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstack.py
More file actions
Latest commit
113 lines (97 loc) · 3.21 KB
/
Copy pathstack.py
File metadata and controls
113 lines (97 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# Stack Abstract Data Type (ADT)
# Stack() creates a new stack that is empty.
# It needs no parameters and returns an empty stack.
# push(item) adds a new item to the top of the stack.
# It needs the item and returns nothing.
# pop() removes the top item from the stack.
# It needs no parameters and returns the item. The stack is modified.
# peek() returns the top item from the stack but does not remove it.
# It needs no parameters. The stack is not modified.
# isEmpty() tests to see whether the stack is empty.
# It needs no parameters and returns a boolean value.
# size() returns the number of items on the stack.
# It needs no parameters and returns an integer.
classAbstractStack:
def__init__(self):
self.top=0
defisEmpty(self):
returnself.top==0
def__len__(self):
returnself.top
def__str__(self):
result='------\n'
forelementinself:
result+=str(element) +'\n'
returnresult[:-1] +'\n------'
classArrayStack(AbstractStack):
def__init__(self, size=10):
"""
Initialize python List with size of 10 or user given input.
Python List type is a dynamic array, so we have to restrict its
dynamic nature to make it work like a static array.
"""
AbstractStack.__init__(self)
self.array= [None] *size
defpush(self, value):
ifself.top==len(self.array):
self.expand()
self.array[self.top] =value
self.top+=1
defpop(self):
ifself.isEmpty():
raiseIndexError("stack is empty")
value=self.array[self.top-1]
self.array[self.top-1] =None
self.top-=1
returnvalue
defpeek(self):
ifself.isEmpty():
raiseIndexError("stack is empty")
returnself.array[self.top]
defexpand(self):
"""
expands size of the array.
Time Complexity: O(n)
"""
newArray= [None] *len(self.array) *2# double the size of the array
fori, elementinenumerate(self.array):
newArray[i] =element
self.array=newArray
def__iter__(self):
probe=self.top-1
whileTrue:
ifprobe<0:
raiseStopIteration
yieldself.array[probe]
probe-=1
classStackNode(object):
def__init__(self, value):
self.value=value
self.next=None
classLinkedListStack(AbstractStack):
def__init__(self):
AbstractStack.__init__(self)
self.head=None
defpush(self, value):
node=StackNode(value)
node.next=self.head
self.head=node
self.top+=1
defpop(self):
ifself.isEmpty():
raiseIndexError("stack is empty")
value=self.head.value
self.head=self.head.next
self.top-=1
returnvalue
defpeek(self):
ifself.isEmpty():
raiseIndexError("stack is empty")
returnself.head.value
def__iter__(self):
probe=self.head
whileTrue:
ifprobeisNone:
raiseStopIteration
yieldprobe.value
probe=probe.next