A queue is a data structure which contains an ordered set of data.
Queues provide three methods for interaction:
- Enqueue - adds data to the “back” or end of the queue
- Dequeue - provides and removes data from the “front” or beginning of the queue
- Peek - reveals data from the “front” of the queue without removing it
Queues can be implemented using a linked list as the underlying data structure. The front of the queue is equivalent to the head node of a linked list and the back of the queue is equivalent to the tail node.
Since operations are only allowed to affect the front or back of the queue, any traversal or modification to other nodes within the linked list is disallowed. Since both ends of the queue must be accessible, a reference to both the head node and the tail node must be maintained.
One last constraint that may be placed on a queue is its length. If a queue has a limit on the amount of data that can be placed into it, it is considered a bounded queue.
Similar to stacks, attempting to enqueue data onto an already full queue will result in a queue overflow. If you attempt to dequeue data from an empty queue, it will result in a queue underflow.
Below is the implementation of the queue in python. I attach an example in the end of this code to better illustrate the functions in the Queue class.
PS: i use the previous Node class here, which is in this article: https://www.cnblogs.com/M1stF0rest/p/15758387.html
from node import Node class Queue: def __init__(self, max_size=None): self.head = None self.tail = None self.max_size = max_size self.size = 0 def enqueue(self, value): if self.has_space(): item_to_add = Node(value) print("Adding " + str(item_to_add.get_value()) + " to the queue!") if self.is_empty(): self.head = item_to_add self.tail = item_to_add else: self.tail.set_next_node(item_to_add) self.tail = item_to_add self.size += 1 else: print("Sorry, no more room!") def dequeue(self): if self.get_size() > 0: item_to_remove = self.head print(str(item_to_remove.get_value()) + " is served!") if self.get_size() == 1: self.head = None self.tail = None else: self.head = self.head.get_next_node() self.size -= 1 return item_to_remove.get_value() else: print("The queue is totally empty!") def peek(self): if self.size > 0: return self.head.get_value() else: print("No orders waiting!") def get_size(self): return self.size def has_space(self): if self.max_size == None: return True else: return self.max_size > self.get_size() def is_empty(self): return self.size == 0 print("Creating a deli line with up to 10 orders...\n------------") deli_line = Queue(10) print("Adding orders to our deli line...\n------------") deli_line.enqueue("egg and cheese on a roll") deli_line.enqueue("bacon, egg, and cheese on a roll") deli_line.enqueue("toasted sesame bagel with butter and jelly") deli_line.enqueue("toasted roll with butter") deli_line.enqueue("bacon, egg, and cheese on a plain bagel") deli_line.enqueue("two fried eggs with home fries and ketchup") deli_line.enqueue("egg and cheese on a roll with jalapeos") deli_line.enqueue("plain bagel with plain cream cheese") deli_line.enqueue("blueberry muffin toasted with butter") deli_line.enqueue("bacon, egg, and cheese on a roll") # ------------------------ # # Uncomment the line below: deli_line.enqueue("western omelet with home fries") # ------------------------ # print("------------\nOur first order will be " + deli_line.peek()) print("------------\nNow serving...\n------------") deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() deli_line.dequeue() # ------------------------ # # Uncomment the line below: deli_line.dequeue() # ------------------------ #