Skip to content

Commit 5916167

Browse files
committed
Added Circular Queue to Python/Data-Structures
1 parent 60d4235 commit 5916167

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
class CircQueue:
2+
"""
3+
Implementation of circular, array-backed queue data structure
4+
"""
5+
6+
# circular queue keeps track of position of recently enqueued item and
7+
# position of next item to dequeue
8+
def __init__(self, limit=20):
9+
self.data = [None] * limit
10+
self.head = -1
11+
self.tail = -1
12+
13+
# add item into the queue
14+
def enqueue(self, val):
15+
if (self.tail + 1) % len(self.data) == self.head:
16+
raise RuntimeError
17+
18+
if self.head == self.tail == -1:
19+
self.tail = 0
20+
self.head = 0
21+
else:
22+
self.tail = (self.tail + 1) % len(self.data)
23+
24+
self.data[self.tail] = val
25+
26+
# remove and return the first item in the queue (first in first out)
27+
def dequeue(self):
28+
if self.head == -1:
29+
raise RuntimeError
30+
31+
data = self.data[self.head]
32+
self.data[self.head] = None
33+
34+
if self.head == self.tail:
35+
self.head = -1
36+
self.tail = -1
37+
else:
38+
self.head = (self.head + 1) % len(self.data)
39+
40+
return data
41+
42+
# resize data array to given size
43+
def resize(self, newsize):
44+
assert newsize > len(self.data)
45+
46+
new_data = []
47+
for item in self:
48+
new_data.append(item)
49+
50+
self.tail = len(new_data) - 1
51+
52+
for _ in range(newsize - len(self.data)):
53+
new_data.append(None)
54+
55+
self.data = new_data
56+
self.head = 0
57+
58+
# return True if queue is empty, otherwise False
59+
def empty(self):
60+
for item in self.data:
61+
if item is not None:
62+
return False
63+
return True
64+
65+
# return True if queue is not empty, otherwise False
66+
def __bool__(self):
67+
return not self.empty()
68+
69+
# return all data in queue in a string
70+
def __str__(self):
71+
if not self:
72+
return ''
73+
return ', '.join(str(item) for item in self)
74+
75+
# return all data in queue in a string
76+
def __repr__(self):
77+
return str(self)
78+
79+
# iter through the queue
80+
def __iter__(self):
81+
idx = self.head
82+
while idx != self.tail:
83+
yield self.data[idx]
84+
idx = (idx + 1) % len(self.data)
85+
yield self.data[idx]
86+
87+
88+
# print option menu and take user input
89+
def option_menu():
90+
print("1. Enqueue")
91+
print("2. Dequeue")
92+
print("3. Resize Queue")
93+
print("4. Print Queue")
94+
print("5. Exit")
95+
96+
try:
97+
option = int(input("Enter option: "))
98+
return option
99+
100+
except Exception as e:
101+
print(f"ERROR: {e}\n")
102+
103+
# test function
104+
def test():
105+
q = CircQueue()
106+
107+
while True:
108+
option = option_menu()
109+
110+
if option == 1:
111+
while True:
112+
try:
113+
item = int(input("Enter value to enqueue (enter character to quit): "))
114+
q.enqueue(item)
115+
except:
116+
print()
117+
break
118+
119+
elif option == 2:
120+
print("Result of dequeue: ", q.dequeue(), "\n")
121+
122+
elif option == 3:
123+
new_size = int(input("Enter new size: "))
124+
q.resize(new_size)
125+
126+
elif option == 4:
127+
print("Current queue: ", q)
128+
print("Current queue data: ", q.data, "\n")
129+
130+
elif option == 5:
131+
print("Exiting...")
132+
break
133+
134+
else:
135+
print("Invalid option\n")
136+
137+
if __name__ == "__main__":
138+
test()

0 commit comments

Comments
 (0)