Skip to content

Commit 69e99be

Browse files
Ashley-J-Georgecclauss
authored andcommitted
Create priority_queue_using_list.py (TheAlgorithms#2435)
* Create priority_queue_using_list.py * Update priority_queue_using_list.py * Update priority_queue_using_list.py * Update priority_queue_using_list.py * Maximum queue size is 100 Co-authored-by: Christian Clauss <[email protected]>
1 parent da4ac2c commit 69e99be

File tree

1 file changed

+232
-0
lines changed

1 file changed

+232
-0
lines changed

Diff for: data_structures/queue/priority_queue_using_list.py

+232
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
"""
2+
Pure Python implementations of a Fixed Priority Queue and an Element Priority Queue
3+
using Python lists.
4+
"""
5+
6+
7+
class OverFlowError(Exception):
8+
pass
9+
10+
11+
class UnderFlowError(Exception):
12+
pass
13+
14+
15+
class FixedPriorityQueue:
16+
"""
17+
Tasks can be added to a Priority Queue at any time and in any order but when Tasks
18+
are removed then the Task with the highest priority is removed in FIFO order. In
19+
code we will use three levels of priority with priority zero Tasks being the most
20+
urgent (high priority) and priority 2 tasks being the least urgent.
21+
22+
Examples
23+
>>> fpq = FixedPriorityQueue()
24+
>>> fpq.enqueue(0, 10)
25+
>>> fpq.enqueue(1, 70)
26+
>>> fpq.enqueue(0, 100)
27+
>>> fpq.enqueue(2, 1)
28+
>>> fpq.enqueue(2, 5)
29+
>>> fpq.enqueue(1, 7)
30+
>>> fpq.enqueue(2, 4)
31+
>>> fpq.enqueue(1, 64)
32+
>>> fpq.enqueue(0, 128)
33+
>>> print(fpq)
34+
Priority 0: [10, 100, 128]
35+
Priority 1: [70, 7, 64]
36+
Priority 2: [1, 5, 4]
37+
>>> fpq.dequeue()
38+
10
39+
>>> fpq.dequeue()
40+
100
41+
>>> fpq.dequeue()
42+
128
43+
>>> fpq.dequeue()
44+
70
45+
>>> fpq.dequeue()
46+
7
47+
>>> print(fpq)
48+
Priority 0: []
49+
Priority 1: [64]
50+
Priority 2: [1, 5, 4]
51+
>>> fpq.dequeue()
52+
64
53+
>>> fpq.dequeue()
54+
1
55+
>>> fpq.dequeue()
56+
5
57+
>>> fpq.dequeue()
58+
4
59+
>>> fpq.dequeue()
60+
Traceback (most recent call last):
61+
...
62+
priority_queue_using_list.UnderFlowError: All queues are empty
63+
>>> print(fpq)
64+
Priority 0: []
65+
Priority 1: []
66+
Priority 2: []
67+
"""
68+
69+
def __init__(self):
70+
self.queues = [
71+
[],
72+
[],
73+
[],
74+
]
75+
76+
def enqueue(self, priority: int, data: int) -> None:
77+
"""
78+
Add an element to a queue based on its priority.
79+
If the priority is invalid ValueError is raised.
80+
If the queue is full an OverFlowError is raised.
81+
"""
82+
try:
83+
if len(self.queues[priority]) >= 100:
84+
raise OverflowError("Maximum queue size is 100")
85+
self.queues[priority].append(data)
86+
except IndexError:
87+
raise ValueError("Valid priorities are 0, 1, and 2")
88+
89+
def dequeue(self) -> int:
90+
"""
91+
Return the highest priority element in FIFO order.
92+
If the queue is empty then an under flow exception is raised.
93+
"""
94+
for queue in self.queues:
95+
if queue:
96+
return queue.pop(0)
97+
raise UnderFlowError("All queues are empty")
98+
99+
def __str__(self) -> str:
100+
return "\n".join(f"Priority {i}: {q}" for i, q in enumerate(self.queues))
101+
102+
103+
class ElementPriorityQueue:
104+
"""
105+
Element Priority Queue is the same as Fixed Priority Queue except that the value of
106+
the element itself is the priority. The rules for priorities are the same the as
107+
Fixed Priority Queue.
108+
109+
>>> epq = ElementPriorityQueue()
110+
>>> epq.enqueue(10)
111+
>>> epq.enqueue(70)
112+
>>> epq.enqueue(4)
113+
>>> epq.enqueue(1)
114+
>>> epq.enqueue(5)
115+
>>> epq.enqueue(7)
116+
>>> epq.enqueue(4)
117+
>>> epq.enqueue(64)
118+
>>> epq.enqueue(128)
119+
>>> print(epq)
120+
[10, 70, 4, 1, 5, 7, 4, 64, 128]
121+
>>> epq.dequeue()
122+
1
123+
>>> epq.dequeue()
124+
4
125+
>>> epq.dequeue()
126+
4
127+
>>> epq.dequeue()
128+
5
129+
>>> epq.dequeue()
130+
7
131+
>>> epq.dequeue()
132+
10
133+
>>> print(epq)
134+
[70, 64, 128]
135+
>>> epq.dequeue()
136+
64
137+
>>> epq.dequeue()
138+
70
139+
>>> epq.dequeue()
140+
128
141+
>>> epq.dequeue()
142+
Traceback (most recent call last):
143+
...
144+
priority_queue_using_list.UnderFlowError: The queue is empty
145+
>>> print(epq)
146+
[]
147+
"""
148+
149+
def __init__(self):
150+
self.queue = []
151+
152+
def enqueue(self, data: int) -> None:
153+
"""
154+
This function enters the element into the queue
155+
If the queue is full an Exception is raised saying Over Flow!
156+
"""
157+
if len(self.queue) == 100:
158+
raise OverFlowError("Maximum queue size is 100")
159+
self.queue.append(data)
160+
161+
def dequeue(self) -> int:
162+
"""
163+
Return the highest priority element in FIFO order.
164+
If the queue is empty then an under flow exception is raised.
165+
"""
166+
if not self.queue:
167+
raise UnderFlowError("The queue is empty")
168+
else:
169+
data = min(self.queue)
170+
self.queue.remove(data)
171+
return data
172+
173+
def __str__(self) -> str:
174+
"""
175+
Prints all the elements within the Element Priority Queue
176+
"""
177+
return str(self.queue)
178+
179+
180+
def fixed_priority_queue():
181+
fpq = FixedPriorityQueue()
182+
fpq.enqueue(0, 10)
183+
fpq.enqueue(1, 70)
184+
fpq.enqueue(0, 100)
185+
fpq.enqueue(2, 1)
186+
fpq.enqueue(2, 5)
187+
fpq.enqueue(1, 7)
188+
fpq.enqueue(2, 4)
189+
fpq.enqueue(1, 64)
190+
fpq.enqueue(0, 128)
191+
print(fpq)
192+
print(fpq.dequeue())
193+
print(fpq.dequeue())
194+
print(fpq.dequeue())
195+
print(fpq.dequeue())
196+
print(fpq.dequeue())
197+
print(fpq)
198+
print(fpq.dequeue())
199+
print(fpq.dequeue())
200+
print(fpq.dequeue())
201+
print(fpq.dequeue())
202+
print(fpq.dequeue())
203+
204+
205+
def element_priority_queue():
206+
epq = ElementPriorityQueue()
207+
epq.enqueue(10)
208+
epq.enqueue(70)
209+
epq.enqueue(100)
210+
epq.enqueue(1)
211+
epq.enqueue(5)
212+
epq.enqueue(7)
213+
epq.enqueue(4)
214+
epq.enqueue(64)
215+
epq.enqueue(128)
216+
print(epq)
217+
print(epq.dequeue())
218+
print(epq.dequeue())
219+
print(epq.dequeue())
220+
print(epq.dequeue())
221+
print(epq.dequeue())
222+
print(epq)
223+
print(epq.dequeue())
224+
print(epq.dequeue())
225+
print(epq.dequeue())
226+
print(epq.dequeue())
227+
print(epq.dequeue())
228+
229+
230+
if __name__ == "__main__":
231+
fixed_priority_queue()
232+
element_priority_queue()

0 commit comments

Comments
 (0)