Stacks & Queues in Python
list.append()/list.pop() (bina argument ke) se ek stack (LIFO) simulate kar sakte ho — end se add/remove karna O(1) hai. Lekin list ke START se remove karna (queue ke liye) O(n) hai — inefficient, isliye queue ke liye collections.deque use hota hai.
deque (double-ended queue) dono ends se O(1) operations deta hai — append()/appendleft() se add, pop()/popleft() se remove, dono taraf se fast.
# Stack (LIFO) — list se:
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop()) # 3 — last in, first out
# Queue (FIFO) — deque se:
from collections import deque
queue = deque()
queue.append(1)
queue.append(2)
queue.append(3)
print(queue.popleft()) # 1 — first in, first out- Stack = list.append()/pop() (end se, O(1))
- Queue = collections.deque (dono ends se O(1))
- list.pop(0) avoid karo — O(n), inefficient
heapq module Python ka built-in min-heap implementation hai — priority_queue jaisa C++ mein tha. Sabse chhota element hamesha heap[0] par hota hai, insert/remove O(log n) hai.
import heapq
nums = [5, 1, 8, 3, 9]
heapq.heapify(nums) # in-place, ab min-heap hai
heapq.heappush(nums, 2)
print(heapq.heappop(nums)) # 1 — sabse chhota
while nums:
print(heapq.heappop(nums), end=" ") # sorted order mein aayega: 2 3 5 8 9Counter (collections module) ek specialized dictionary hai jo elements ki frequency automatically count karta hai — bahut common pattern jo manually likhne mein 4-5 lines lagti, ek line mein ho jaata hai.
from collections import Counter
words = ["apple", "banana", "apple", "cherry", "apple"]
counts = Counter(words)
print(counts) # Counter({'apple': 3, 'banana': 1, 'cherry': 1})
print(counts["apple"]) # 3
print(counts.most_common(2)) # [('apple', 3), ('banana', 1)] — top 2