λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Algorithms & Data Structure

[Data Structure] μŠ€νƒ(Stack) κ³Ό 큐(Queue)

by vodkassi 2021. 7. 7.
728x90

μŠ€νƒκ³Ό νλŠ” κ°€μž₯ 자주 ν™œμš©λ˜λŠ” 자료ꡬ쑰 쀑 ν•˜λ‚˜μ΄λ‹€. 

 

✨ μŠ€νƒ(Stack)

λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ‚˜μ€‘μ— λ‚˜κ°€λŠ” ν˜•μ‹μ˜ 자료ꡬ쑰이며, μž…μΆœκ΅¬κ°€ ν•˜λ‚˜μ΄λ‹€.

ν›„μž…μ„ μΆœ (LIFO; Last in First Out) 의 ꡬ쑰λ₯Ό 가지고 μžˆλ‹€.

μ‚½μž…κ³Ό μ‚­μ œκ°€ μΌμ–΄λ‚˜λŠ” μœ„μΉ˜λ₯Ό Top 이라고 ν•œλ‹€.

λΉ„μ–΄μžˆλŠ” μŠ€νƒμ—μ„œ μ›μ†Œλ₯Ό μΆ”μΆœν•˜λ €κ³  ν•  λ•ŒλŠ” stack underflow, μŠ€νƒμ΄ λ„˜μΉ˜λŠ” κ²½μš°λŠ” stack overflow 이닀.

 

βœ¨μŠ€νƒ μ˜ˆμ‹œ

λͺ¨λ°”일 ν™”λ©΄μ˜ 경우, μ‚¬μš©μžκ°€ ν˜„μž¬ 보고 μžˆλŠ” 화면이 Top 이닀. 

λ‹€μŒ ν™”λ©΄ 클릭 μ‹œ, μƒˆ 화면을 Stack 에 μΆ”κ°€ν•˜κ³  μ΄λ™ν•œλ‹€.

이전 ν™”λ©΄μœΌλ‘œ λŒμ•„κ°ˆ μ‹œ, ν˜„μž¬ 화면을 Stack μ—μ„œ μ§€μš°κ³  μ΄λ™ν•œλ‹€. 

 

✨ 큐(Queue)

λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ν˜•μ‹μ˜ 자료ꡬ쑰이며, μž…μΆœκ΅¬κ°€ λ³‘λ ¬ν•˜μ—¬ λ‘κ°œμ΄λ‹€.

μ„ μž…μ„ μΆœ (FIFO; First in First Out) 의 ꡬ쑰λ₯Ό 가지고 μžˆλ‹€.

데이터 μž…λ ₯은 enQueue 라고 λΆ€λ₯΄λ©°, μž…λ ₯이 μΌμ–΄λ‚˜λŠ” μœ„μΉ˜λŠ” 꼬리/Rear 이닀.

데이터 좜λ ₯은 deQueue 라고 λΆ€λ₯΄λ©°, 좜λ ₯이 μΌμ–΄λ‚˜λŠ” μœ„μΉ˜λŠ” 머리/Front 이닀.

 

✨큐 μ˜ˆμ‹œ

κ²Œμž„ 맀칭 μ‹œμŠ€ν…œμ˜ 경우, deQueue둜 μœ μ €λ“€μ΄ μž…μž₯ν•œλ‹€.

정해진 μΈμ›λ§ŒνΌ μˆœμ„œλŒ€λ‘œ λŠμ–΄μ„œ 맀칭이 되며, 이듀은 enQueue 둜 퇴μž₯ν•œλ‹€. 

 

Stack, Queue

 

✨ κ΅¬ν˜„ (Python)

μŠ€νƒ: 

stack = [0, 1, 2, 3]

stack.append(4) # 데이터 μ‚½μž…
print(stack) # [0, 1, 2, 3, 4]

stack.pop() # 4, 데이터 μ‚­μ œ
print(stack) # [0, 1, 2, 3]

# top μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜κ³  싢을 경우:
# 방법 1)
print(stack[::-1]) # 3, 2, 1, 0
# 방법 2)
stack.reverse() 
print(stack) # [3, 2, 1, 0]

 

큐:

from collections import deque

temp = [0, 1, 2, 3]
queue = deque(temp) 
print(queue) # deque([0, 1, 2, 3])

queue.append(4) # 데이터 μ‚½μž…
print(queue) # deque([0, 1, 2, 3, 4])

queue.popleft() # 0, 데이터 μ‚­μ œ
print(queue) # deque([1, 2, 3, 4])

# λΉ„μ–΄μžˆλŠ” queue λ§Œλ“€κ³  싢을 경우:
queue = deque()

 

✨ λ°ν¬(Deque) λž€? 

Double-ended queue둜, python 의 Collections λͺ¨λ“ˆμ— μžˆλŠ” 객체이닀.

Stack/queue μ•Œκ³ λ¦¬μ¦˜μ— 자주 ν™œμš©λœλ‹€. 

queue = deque([0,1,2,3])

# μ•Œμ•„λ‘λ©΄ 쒋을 μΆ”κ°€ λ©”μ„œλ“œλ“€

# rotate()
queue.rotate(1) # [3, 0, 1, 2]
queue.rotate(2) # [2, 3, 0, 1]
queue.rotate(-1) # [1, 2, 3, 0]

# extend(), extendleft()
queue.extend('ab') # [0, 1, 2, 3, a, b]
queue.extendleft('ab') # [b, a, 0, 1, 2, 3]

# clear()
queue.clear() # []

λŒ“κΈ€