Stack and Queue

λ°°μ—΄μ—μ„œ 쑰금 더 λ°œμ „ν•œ ν˜•νƒœμ˜ 자료ꡬ쑰

Stack (μŠ€νƒ)

κ°œλ…

  • LIFO(Last In First Out): ν›„μž…μ„ μΆœ
  • λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ꡬ쑰

μ£Όμš” μ—°μ‚°

  1. push: 데이터λ₯Ό μŠ€νƒμ˜ 맨 μœ„μ— μ‚½μž…
  2. pop: μŠ€νƒμ˜ 맨 μœ„ 데이터λ₯Ό μ œκ±°ν•˜κ³  λ°˜ν™˜
  3. top: μŠ€νƒμ˜ 맨 μœ„ 데이터λ₯Ό 확인 (μ œκ±°ν•˜μ§€ μ•ŠμŒ)

λ™μž‘ κ³Όμ •

  1. 빈 μŠ€νƒ β†’ push(μƒˆ κ°’) β†’ μŠ€νƒμ— κ°’ μΆ”κ°€
  2. 데이터 μžˆλŠ” μŠ€νƒ β†’ pop() β†’ 맨 μœ„ κ°’ 제거
  3. top 포인터가 항상 μŠ€νƒμ˜ μ΅œμƒλ‹¨μ„ 가리킴

ν™œμš©

  • 깊이 μš°μ„  탐색(DFS: Depth First Search)
  • λ°±νŠΈλž˜ν‚Ή μ’…λ₯˜μ˜ μ½”λ”© ν…ŒμŠ€νŠΈμ— 효과적
  • LIFO(ν›„μž…μ„ μΆœ) κ°œλ… μžμ²΄κ°€ μž¬κ·€ ν•¨μˆ˜ μ•Œκ³ λ¦¬μ¦˜μ˜ 원리와 일λ§₯상톡

Queue (큐)

κ°œλ…

  • FIFO(First In First Out): μ„ μž…μ„ μΆœ 자료ꡬ쑰
  • μŠ€νƒκ³Ό 달리 μ–‘μͺ½ λμ—μ„œ μ‚½μž…κ³Ό μ‚­μ œκ°€ 이루어짐

큐의 ꡬ쑰

[μƒˆ κ°’] β†’ [κ°’] [κ°’] [κ°’] [κ°’] [μ§€μšΈ κ°’] β†’ [pop]
        ↑                           ↑
      back                       front
      (rear)                    (head)

μ£Όμš” μ—°μ‚°

  • push: back 뢀뢄에 μƒˆλ‘œμš΄ 데이터λ₯Ό μ‚½μž…ν•˜λŠ” μ—°μ‚°
  • pop: frontμ—μ„œ 데이터λ₯Ό μ œκ±°ν•˜λŠ” μ—°μ‚°
  • back: νμ—μ„œ κ°€μž₯ 끝 데이터λ₯Ό κ°€λ¦¬ν‚€λŠ” μ˜μ—­
  • front: νμ—μ„œ κ°€μž₯ μ•žμ˜ 데이터λ₯Ό κ°€λ¦¬ν‚€λŠ” μ˜μ—­

λ™μž‘ 원리

  1. μƒˆ 데이터 μΆ”κ°€: back(rear) μœ„μΉ˜μ— push
  2. 데이터 제거: front(head) μœ„μΉ˜μ—μ„œ pop
  3. λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°

큐 κ΄€λ ¨ μš©μ–΄

  • back = rear: 큐의 λ’€μͺ½ (μ‚½μž… μœ„μΉ˜)
  • front = head: 큐의 μ•žμͺ½ (μ‚­μ œ μœ„μΉ˜)

ν™œμš© μ˜ˆμ‹œ

  • ν”„λ¦°ν„° λŒ€κΈ°μ—΄
  • BFS(λ„ˆλΉ„ μš°μ„  탐색)
  • μž‘μ—… μŠ€μΌ€μ€„λ§
  • 버퍼링 μ‹œμŠ€ν…œ

핡심 차이점

κ΅¬μ‘°μ‚½μž…/μ‚­μ œ μœ„μΉ˜λ°μ΄ν„° μˆœμ„œμ˜ˆμ‹œ
μŠ€νƒν•œμͺ½ 끝(top)ν›„μž…μ„ μΆœμ ‘μ‹œ μŒ“κΈ°
큐양μͺ½ λμ„ μž…μ„ μΆœλŒ€κΈ°μ€„

μš°μ„ μˆœμœ„ 큐 (Priority Queue)

  • λ“€μ–΄κ°„ μˆœμ„œμ™€ 상관없이 μš°μ„ μˆœμœ„κ°€ 높은 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” 자료ꡬ쑰
  • 일반적으둜 νž™(heap)을 μ΄μš©ν•΄ κ΅¬ν˜„

μ•Œκ³ λ¦¬μ¦˜κ³Όμ˜ μ—°κ΄€μ„±

  • μŠ€νƒ β†’ DFS (깊이 μš°μ„  탐색)
  • 큐 β†’ BFS (λ„ˆλΉ„ μš°μ„  탐색)