class Node:
def __init__(self, data):
self.data = data
self.next = None
class Queue:
def __init__(self, max_size):
self.front = None
self.rear = None
self.max_size = max_size
self.size = 0
def enqueue(self, data):
if self.size >= self.max_size:
print("Queue Overflow")
return
new_node = Node(data)
if self.rear is None:
self.front = new_node
self.rear = new_node
else:
self.rear.next = new_node
self.rear = new_node
self.size += 1
return data
def dequeue(self):
if self.front is None:
print("Queue Underflow")
return
data = self.front.data
self.front = self.front.next
if self.front is None:
self.rear = None
self.size -= 1
return data
def peek(self):
if self.front is None:
return None
return self.front.data
def is_empty(self):
return self.front is None
def is_full(self):
return self.size >= self.max_size