ЁЯПл The SchoolтА║ЁЯзо DSAтА║ЁЯеЮ рдзрдбрд╛ 04 тАФ Stacks рдЖрдгрд┐ queues: рдЯреНрд░реЗрдЪреА рдЪрд│рдд рдЖрдгрд┐ рдЬреЗрд╡рдгрд╛рдЪреА рд░рд╛рдВрдЧ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯеЮ рдзрдбрд╛ 04 тАФ Stacks рдЖрдгрд┐ queues: рдЯреНрд░реЗрдЪреА рдЪрд│рдд рдЖрдгрд┐ рдЬреЗрд╡рдгрд╛рдЪреА рд░рд╛рдВрдЧ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдкреБрдвреЗ: lesson-05-hash-maps


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ04. рддреБрдореНрд╣реА рдХреЛрдгрддреЗ рдЯреЛрдХ рд╡рд╛рдкрд░рддрд╛ рдпрд╛рд╡рд░реВрди рдард░рдгрд╛рд░реЗ рджреЛрди containers, рдПрдХрд╛ рдУрд│реАрдЪрд╛ bracket checker, рдЖрдгрд┐ рд╕рд░рдХрд╡рд╛рд╕рд░рдХрд╡реА рди рдХрд░рдгрд╛рд░реА queue.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдХреЕрдиреНрдЯреАрдирдордзреНрдпреЗ рд╕реНрд╡рдЪреНрдЫ рдЯреНрд░реЗ рдПрдХрд╛ рдЪрд│рддреАрд╡рд░ рдареЗрд╡рддрд╛рдд: рд╢реЗрд╡рдЯреА рдареЗрд╡рд▓реЗрд▓рд╛ рдЯреНрд░реЗ рдЖрдзреА рдЙрдЪрд▓рд▓рд╛ рдЬрд╛рддреЛ (LIFO). рд╡рд┐рджреНрдпрд╛рд░реНрдереА рд░рд╛рдВрдЧреЗрдд рдерд╛рдВрдмрддрд╛рдд: рдЖрдзреА рдЖрд▓реЗрд▓реНрдпрд╛рд▓рд╛ рдЖрдзреА рдЬреЗрд╡рдг рдорд┐рд│рддреЗ (FIFO). рджреЛрдиреНрд╣реА рдЕрд╢рд╛ lists рдЖрд╣реЗрдд рдЬрд┐рдереЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рдПрдХрдЪ рдЯреЛрдХ рд╣рд╛рддрд╛рд│рд╛рдпрдЪреА рдкрд░рд╡рд╛рдирдЧреА рдЖрд╣реЗ тАФ рдЖрдгрд┐ рд╣реЗ рдмрдВрдзрдирдЪ рддреНрдпрд╛рдВрдирд╛ рдЙрдкрдпреЛрдЧреА рдмрдирд╡рддреЗ: undo, brackets рдЖрдгрд┐ call stack рдпрд╛ рдЪрд│рддреА рдЖрд╣реЗрдд; printing, tasks рдЖрдгрд┐ breadth-first search рдпрд╛ рд░рд╛рдВрдЧрд╛ рдЖрд╣реЗрдд.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
  subgraph stack["ЁЯеЮ stack (LIFO)"]
    T3["tray 3 тЖР top"] --- T2["tray 2"] --- T1["tray 1"]
  end
  subgraph queue["ЁЯН╜я╕П queue (FIFO)"]
    F["front: Aishwarya"] --- Q2["Katrina"] --- B["back: Dipika"]
  end

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

stack рд╡рд╛рдкрд░реВрди bracket checker рд╕рд╣рд╛ рдУрд│реАрдВрдЪрд╛ рд╣реЛрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдЬрд╡рд│рдЬрд╡рд│ рдЕрд╢рдХреНрдп; queue рд╢рд┐рд╡рд╛рдп BFS рдЪреА рдХрд▓реНрдкрдирд╛рдЪ рдХрд░рддрд╛ рдпреЗрдд рдирд╛рд╣реА. list.pop(0) рдордзрд▓рд╛ O(n) рд╕рд╛рдкрд│рд╛ рдорд╛рд╣реАрдд рдЕрд╕рд▓рд╛ рддрд░ рдПрдХ рдЦрд░рд╛ outage рд╡рд╛рдЪрддреЛ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

Queue items рдПрдХрд╛ рдард░рд▓реЗрд▓реНрдпрд╛ list рдордзреНрдпреЗ head рдЖрдгрд┐ n рд╕рд╣ рдареЗрд╡рддреЗ; dequeue head рд▓рд╛ capacity рдЪреНрдпрд╛ modulo рдиреЗ рдкреБрдвреЗ рд╕рд░рдХрд╡рддреЛ; рднрд░рд▓реА рдХреА _grow рджреБрдкреНрдкрдЯ рдЖрдХрд╛рд░рд╛рдЪреНрдпрд╛ list рдордзреНрдпреЗ copy рдХрд░рддреЛ. demo.py stackqueue bracket checker рдПрдХрд╛ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдЖрдгрд┐ рдПрдХрд╛ рд╡рд╛рдИрдЯ string рд╡рд░ рдЪрд╛рд▓рд╡рддреЛ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 dsa/demo.py stackqueue
python3 - <<'EOF'
import time
from collections import deque
n = 200_000
lst = list(range(n)); t = time.perf_counter()
while lst: lst.pop(0)                                  # the trap
print(f"list.pop(0) ├Ч {n}: {(time.perf_counter() - t) * 1000:.0f} ms")
dq = deque(range(n)); t = time.perf_counter()
while dq: dq.popleft()
print(f"deque.popleft() ├Ч {n}: {(time.perf_counter() - t) * 1000:.0f} ms")
EOF

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

рдЪрд│рддреАрд╡рд░реВрди tray 3, tray 2; рд░рд╛рдВрдЧреЗрддреВрди Aishwarya, Katrina рдпрд╛рдВрдирд╛ рдЬреЗрд╡рдг; brackets рд╕рд╛рдареА рдЖрдзреА True рдордЧ False. list.pop(0) loop рд╕реЗрдХрдВрдж рдШреЗрддреЛ; deque milliseconds рдШреЗрддреЗ тАФ O(n┬▓) рд╡рд┐рд░реБрджреНрдз O(n).

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

list рд▓рд╛ рдПрдХрд╛рдЪ рдЯреЛрдХрд╛рдкреБрд░рддреЗ рдмрд╛рдВрдзрд▓реЗ рдХреА рджреЛрди structures рдорд┐рд│рддрд╛рдд, рдЖрдгрд┐ рддреНрдпрд╛рдВрдкреИрдХреА рдПрдХрд╛рд▓рд╛ рджрд┐рд▓реЗрд▓реЗ рд╡рдЪрди рдкрд╛рд│рд╛рдпрд▓рд╛ ring buffer (рдХрд┐рдВрд╡рд╛ deque) рд▓рд╛рдЧрддреЛ тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА рддреЛ рд╕рд╛рдкрд│рд╛ рдореЛрдЬрд▓рд╛рдд.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: message queues, undo stacks, request pipelines, event loop тАФ рдкреНрд░рддреНрдпреЗрдХ рдореНрд╣рдгрдЬреЗ рдирд╛рд╡ рджрд┐рд▓реЗрд▓рд╛ stack рдХрд┐рдВрд╡рд╛ queue. network cards рдЖрдгрд┐ logging libraries рд╕рд░рдХрд╡рд╛рд╕рд░рдХрд╡реА рдЯрд╛рд│рд╛рдпрд▓рд╛ ring buffer рд╡рд╛рдкрд░рддрд╛рдд.

тПня╕П рдкреБрдвреЗ

рдзрдбрд╛ 05 тАФ hash maps рдЖрдгрд┐ sets: рдирд╛рд╡рд╛рдиреБрд╕рд╛рд░ рдХрдкреНрдкреЗ, рднрд╛рд╖реЗрддрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдЙрдкрдпреЛрдЧреА structure.

ЁЯеЮ Lesson 04 тАФ Stacks & queues: the tray pile and the lunch line

ЁЯУН You are here: Lesson 04 of 12 ┬╖ Next: lesson-05-hash-maps


ЁЯУж What's in this branch

Lessons 01тАУ04. Two containers defined by which end you use, the one-line bracket checker, and a queue that does not shuffle.

ЁЯзТ Explain like I'm 5

In the canteen, clean trays go on a pile: the last tray put on is the first one taken off (LIFO). Pupils wait in a line: first to join is first served (FIFO). Both are lists where you are only allowed to touch one end тАФ and that restriction is exactly what makes them useful: undo, brackets and the call stack are piles; printing, tasks and breadth-first search are lines.

ЁЯЧ║я╕П Diagram

flowchart LR
  subgraph stack["ЁЯеЮ stack (LIFO)"]
    T3["tray 3 тЖР top"] --- T2["tray 2"] --- T1["tray 1"]
  end
  subgraph queue["ЁЯН╜я╕П queue (FIFO)"]
    F["front: Aishwarya"] --- Q2["Katrina"] --- B["back: Dipika"]
  end

тЭУ What

ЁЯдФ Why

The bracket checker is six lines with a stack and nearly impossible without one; BFS is unthinkable without a queue. Knowing the O(n) trap in list.pop(0) saves a real outage.

ЁЯФз How (in this repo)

Queue stores items in a fixed list with head and n; dequeue moves head forward modulo capacity; when full, _grow copies into a list twice the size. demo.py stackqueue runs the bracket checker on a good and a bad string.

ЁЯзк Try it

python3 dsa/demo.py stackqueue
python3 - <<'EOF'
import time
from collections import deque
n = 200_000
lst = list(range(n)); t = time.perf_counter()
while lst: lst.pop(0)                                  # the trap
print(f"list.pop(0) ├Ч {n}: {(time.perf_counter() - t) * 1000:.0f} ms")
dq = deque(range(n)); t = time.perf_counter()
while dq: dq.popleft()
print(f"deque.popleft() ├Ч {n}: {(time.perf_counter() - t) * 1000:.0f} ms")
EOF

тЬЕ Verify тАФ what you should see

tray 3, tray 2 off the pile; Aishwarya, Katrina served from the line; True then False for the brackets. The list.pop(0) loop takes seconds; the deque takes milliseconds тАФ O(n┬▓) versus O(n).

ЁЯПБ What you just proved

Restricting a list to one end gives you two structures, one of which needs a ring buffer (or a deque) to keep its promise тАФ and you measured the trap.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: message queues, undo stacks, request pipelines, the event loop тАФ every one is a stack or a queue with a name. The ring buffer is how network cards and logging libraries avoid shuffling.

тПня╕П Next

Lesson 05 тАФ hash maps & sets: pigeonholes by name, the most useful structure in the language.

тЖР Previouslinked listsNext тЖТhash maps

This page is the lesson's README from the lesson-04-stacks-queues branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.