diff --git a/data_structures/queue/__pycache__/queue.cpython-312.pyc b/data_structures/queue/__pycache__/queue.cpython-312.pyc new file mode 100644 index 00000000..b42aac97 Binary files /dev/null and b/data_structures/queue/__pycache__/queue.cpython-312.pyc differ diff --git a/data_structures/queue/queue.py b/data_structures/queue/queue.py index a02ae3ab..e196b0cb 100644 --- a/data_structures/queue/queue.py +++ b/data_structures/queue/queue.py @@ -6,23 +6,64 @@ class Queue: Queue follows First-In-First-Out methodology, i.e., the data item stored first will be accessed first. """ + class __Node: # new addition part + """ used for double linked list logic of queue""" + """ should not available outside the class""" + def __init__(self,element,next = None,prev = None): + self.ele = element + self.next = next - def __init__(self): - self.entries = [] - self.length = 0 - self.front = 0 + def __init__(self): # modified part + + self.head = None # points to last pushed element (enqueue part) + self.length = 0 # number of elements in it + self.Tail = None # points to first pushed element (dequeue part) + + def is_empty(self): # new addition part + """check is queue object is empty or not + return boolean + """ + return self.length<=0 + + def put(self, item): # modified part + """add item to queue - def put(self, item): - self.entries.append(item) - self.length += 1 + Args: + item (any): item to be pushed + """ + temp = self.__Node(item) # create new node + + if self.is_empty(): + # initialize the doubly linked list + self.head = temp + self.Tail = temp + + self.length += 1 + return + # already initialized so just add the item - def get(self): - if self.length <= 0: - return + self.head.next = temp # point to next element + self.head = self.head.next # move pointer to next element which is last pushed element + + self.length += 1 + return + + def get(self): # modified part + """ pop the tail element and move the pointer one step ahead + """ + if self.is_empty(): + return + self.length -= 1 - de_queued = self.entries[self.front] - self.entries = self.entries[1:] - return de_queued + + temp = self.Tail + nex = self.Tail.next + self.Tail.next = None + self.Tail = nex + + return temp.ele + + def rotate(self, rotation): for i in range(rotation): @@ -30,3 +71,6 @@ def rotate(self, rotation): def size(self): return self.length + + def __len__(self): # new addition part + return self.length \ No newline at end of file