-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata_structures.py
More file actions
132 lines (107 loc) · 3.85 KB
/
data_structures.py
File metadata and controls
132 lines (107 loc) · 3.85 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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
class Node:
def __init__(self, value):
self.value = value
self.next = None
self.prev = None
class double_linked_list:
def __init__(self):
self.head = None
self.tail = None
self.size = -1
def insert(self, value, location = None):
node = Node(value)
#location is none only if we are inserting at the end
if self.head == None: #Nothing has been inserted
self.head = self.tail = node
self.head.prev = self.tail.next = None
self.size += 1
elif location == 0: #insert at start of LL
node.next = self.head
self.head.prev = node #update nextNodes prev reference
self.head = node
self.size += 1
elif location == None: #insert at end of LL
node.prev = self.tail
self.tail.next = self.tail = node #update tail and 2nd to last element
node.next = None
self.size += 1
else: #inserting internally
temp_node = self.head
for i in range(location-2): temp_node = temp_node.next
next = temp_node.next
node = double_linked_list().createNode(value, next = next, prev = temp_node)
next.prev = node
temp_node.next = node
self.size += 1
def deleteNode(self, location):
if self.size == -1: return "Error: LL doesn't exist"
elif self.size == 0: #delete only node
self.head = self.tail = None
self.size -= 1
elif location == 0: #delete 0th element
self.head = self.head.next
self.head.prev = None
self.size -= 1
elif location >= self.size: #delete last node
self.tail = self.tail.prev
self.tail.next = None
self.size -= 1
else:
temp_node = self.head
for i in range(location-2):
temp_node = temp_node.next
temp_node.next = temp_node.next.next #update prev nodes reference
if temp_node.next != None:
temp_node.next.prev = temp_node #update next nodes prev reference
def deleteList(self):
self.head = self.tail = None
self.size = 0
def traverse(self):
temp_node = self.head
while temp_node != None:
print temp_node.value
temp_node = temp_node.next
def getHead(self): return self.head
def getTail(self): return self.tail
class Stack():
"""
Last in first out stack. Used for DFS.
"""
def __init__(self):
self.stack = double_linked_list()
def push(self, value):
if self.stack.head == None: self.stack.insert(value)
else: self.stack.insert(value, 0)
def pop(self):
if self.stack.size == -1: return "Error: Stack Empty"
else:
node = self.stack.head
if node.next != None: #if snode not only element
self.stack.head = node.next
node.next.prev = None
else: #popping only element
self.stack.head == None
self.stack.tail == None
self.stack.size -= 1
return node.value
def isEmpty(self):
return self.stack.head == None
class Queue():
"""
first in first out queue. Used for BFS
"""
def __init__(self):
self.queue = []
self.top = 0
def enQueue(self, value):
self.top += 1
if len(self.queue) == 0:
self.queue.append(value)
else:
self.queue.insert(len(self.queue), value)
def deQueue(self):
value = self.queue[0]
self.queue.remove(value)
return value
def isEmpty(self):
return self.top == 0