Deque
A Deque (Double-Ended Queue) is a data structure that allows insert and delete from both ends: front and back.
Basic Operations
- add_front: Add an element at the front.
- add_rear: Add an element at the back.
- remove_front: Remove an element from the front.
- remove_rear: Remove an element from the back.
Implementation with Python collections.deque
from collections import deque
dq = deque()
# Add operations
dq.append(10) # add rear: [10]
dq.append(20) # add rear: [10, 20]
dq.appendleft(5) # add front: [5, 10, 20]
# Remove operations
dq.pop() # remove rear: [5, 10]
dq.popleft() # remove front: [10]
print(dq) # deque([10])
Class Implementation
class Deque:
def __init__(self):
self.items = deque()
def add_front(self, item):
self.items.appendleft(item)
def add_rear(self, item):
self.items.append(item)
def remove_front(self):
if self.is_empty():
raise IndexError("Deque is empty")
return self.items.popleft()
def remove_rear(self):
if self.is_empty():
raise IndexError("Deque is empty")
return self.items.pop()
def is_empty(self):
return len(self.items) == 0
def size(self):
return len(self.items)
def peek_front(self):
if self.is_empty():
raise IndexError("Deque is empty")
return self.items[0]
def peek_rear(self):
if self.is_empty():
raise IndexError("Deque is empty")
return self.items[-1]
Time Complexity
| Operation | Time |
|---|---|
| add_front | O(1) |
| add_rear | O(1) |
| remove_front | O(1) |
| remove_rear | O(1) |
| Peek | O(1) |
| Search | O(n) |
Deque Applications
- Palindrome Checker: Check whether text reads the same both ways.
- Sliding Window: Maximum/minimum within a window.
- Queue and Stack implementation: Flexible for both.
- Browser Navigation: Back and forward history.
- Work Stealing Queue: Parallelism in schedulers.
Example: Palindrome Checker
from collections import deque
def is_palindrome(s):
dq = deque(s)
while len(dq) > 1:
if dq.popleft() != dq.pop():
return False
return True
print(is_palindrome("racecar")) # True
print(is_palindrome("hello")) # False
Example: Sliding Window Maximum
from collections import deque
def max_sliding_window(nums, k):
dq = deque()
result = []
for i, num in enumerate(nums):
while dq and dq[0] < i - k + 1:
dq.popleft()
while dq and nums[dq[-1]] < num:
dq.pop()
dq.append(i)
if i >= k - 1:
result.append(nums[dq[0]])
return result
print(max_sliding_window([1, 3, -1, -3, 5, 3, 6, 7], 3))
# [3, 3, 5, 5, 6, 7]
A Deque is versatile for two-ended access. Now let's study the Hash Table for key-based data access.