Queue: A linear data structure that operates in a FIFO (First In, First Out) manner. Items are added at the rear (tail) and removed from the front (head).
Understand the Queue data structure.
Learn to implement Queues in Python including bounded and circular Queues.
Enqueue: Add an item to the rear of the queue.
Dequeue: Remove an item from the front of the queue.
isEmpty: Check if the queue is empty.
size: Get the current number of items in the queue.
Example Visualization:
Front and Rear representation with data elements.
Printing Queue: Manage jobs waiting to be printed.
Process Scheduling: Manage tasks for CPU processing.
Keyboard Buffering: Handle keystroke inputs.
Maze Traversal: Store paths while seeking a solution.
Implemented using lists in Python:
Queue Class:
Initializes empty list to hold items.
Methods: enqueue, dequeue, isEmpty, size, clear.
class Queue:
def __init__(self):
self._items = []
def enqueue(self, item):
self._items.insert(0,item)
def dequeue(self):
return self._items.pop()
def isEmpty(self):
return self._items == []
def size(self):
return len(self._items)
def clear(self):
self._items = []
List Implementation:
Rear at position 0:
Enqueue O(n), Dequeue O(1)
Rear at the end:
Enqueue O(1), Dequeue O(n)
Doubly Linked List offers O(1) for both enqueue and dequeue operations.
Bounded Queue: A queue with a fixed capacity. You know the maximum number of items it can hold.
Bounded Queue ADT:
Constructor: Creates an empty bounded queue.
enqueue(item): Adds an item at the rear if there is room.
dequeue(): Removes and returns the front item.
isFull(): Checks if the queue has reached its capacity.
size(): Returns the current number of items in the queue.
class BoundedQueue:
def __init__(self, capacity):
assert capacity > 0
self._items = []
self._capacity = capacity
def enqueue(self, item):
if len(self._items) >= self._capacity:
raise Exception('Error: Queue is full')
self._items.append(item)
Circular Queue: A bounded queue where the rear and front indices move through the list, making it circular.
Key Feature: Both indices wrap around when the end of the array is reached.
Modulus Operation: Used to handle wrapping around the array for enqueueing and dequeueing operations.
index = (index + 1) % capacity
class CircularQueue:
def __init__(self, capacity):
if type(capacity) != int or capacity <= 0:
raise Exception('Capacity Error')
self._items = [None] * capacity
self._capacity = capacity
self._count = 0
self._head = 0
self._tail = 0
def enqueue(self, item):
if self._count == self._capacity:
raise Exception('Error: Queue is full')
self._items[self._tail] = item
self._tail = (self._tail + 1) % self._capacity
self._count += 1
Regular Queue: Simple direct line addition/removal.
Bounded Queue: Fixed size; raises exceptions at capacity limits.
Circular Queue: Efficient space utilization; no need for resizing.