Computer Science/DS & Algorithm

Linear Data Structure: μŠ€νƒ, 큐, 덱

geum 2021. 7. 4. 21:17

 

κ°œλ…

자료 κ°„μ˜ μ—°κ²° ν˜•νƒœμ— 따라 자료ꡬ쑰의 μ’…λ₯˜λ₯Ό κ΅¬λ³„ν–ˆμ„ λ•Œ, 자료λ₯Ό 순차적으둜 λ‚˜μ—΄ν•œ ν˜•νƒœλ₯Ό μ„ ν˜• 자료ꡬ쑰라고 ν•œλ‹€. ν•˜λ‚˜μ˜ 자료 뒀에 λ‹€λ₯Έ ν•˜λ‚˜μ˜ μžλ£Œκ°€ μ˜€λŠ” ν˜•μ‹μœΌλ‘œ μ„ ν˜• 자료ꡬ쑰 μ•ˆμ—μ„œλ„ κΈ°λ³Έ, μ œν•œμœΌλ‘œ λ‚˜λ‰œλ‹€. 이 κΈ€μ—μ„œλŠ” μ œν•œ μ„ ν˜• μžλ£Œκ΅¬μ‘°μ— μ†ν•˜λŠ” μŠ€νƒ, 큐, 덱에 λŒ€ν•΄ μ •λ¦¬ν•œλ‹€.

 

 

μŠ€νƒ(Stack)

 

좜처 : https://ko.wikipedia.org/

 

μŠ€νƒ, 큐, 덱의 κ°€μž₯ 큰 차이점은 λ°μ΄ν„°μ˜ μΆœμž… λ°©ν–₯이닀. μŠ€νƒμ€ 데이터가 λ“€μ–΄μ˜€κ³  λ‚˜κ°€λŠ” 길이 ν•œ λ°©ν–₯ 밖에 μ—†μ–΄μ„œ 데이터λ₯Ό μŠ€νƒμ—μ„œ λΊ„ 경우 μœ„μ˜ 사진과 같이 λ“€μ–΄μ˜¨ 곳으둜 λ‚˜κ°€κ²Œ λœλ‹€. 책을 μŒ“λŠ” κ²ƒμ²˜λŸΌ μ•„λž˜μͺ½λΆ€ν„° 값이 차곑차곑 μŒ“μ΄κΈ° λ•Œλ¬Έμ— λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” LIFO(Last In First Out, ν›„μž…μ„ μΆœ) ꡬ쑰이닀. μœ„ μ΄λ―Έμ§€μ²˜λŸΌ μ„Έλ‘œ ν˜•νƒœλ‘œ μŠ€νƒμ„ μ„€λͺ…ν•˜λŠ” 그림이 ꡉμž₯히 λ§Žμ€λ°, λ°°μ—΄λ‘œ μŠ€νƒμ„ κ΅¬ν˜„ν•˜κ²Œ 되면 κ°€λ‘œ ν˜•νƒœλ‘œ ν‘œν˜„ν•˜λŠ” λ°°μ—΄κ³Ό μœ„ 이미지가 쑰금 ν—·κ°ˆλ¦΄ 수 μžˆλ‹€. (λŠ” 사싀 λ‚΄κ°€ ν—·κ°ˆλ ΈκΈ° λ•Œλ¬Έμ— πŸ˜…)

 

κ²°λ‘ λΆ€ν„° λ§ν•˜λ©΄ λ°°μ—΄μ—μ„œλŠ” μΈλ±μŠ€κ°€ 클수둝 λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ μ›μ†Œκ°€ λœλ‹€.

 

stack = []

stack.append(1)
stack.append(2)
stack.append(3)
stack.append(4)
stack.append(5)

print("- - - - - 데이터 μ‚½μž…(push) - - - - -")
print(stack)
print("\n")

print("- - - - - 데이터 μ‚­μ œ(pop) - - - - -\n")
while len(stack) != 0:
    v = stack.pop()
    print(v)

 

κ°œλ…λ§Œ κ΅¬ν˜„ν•΄λ³Έ μœ„ μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³ΌλŠ”

 

πŸ’‘ queue λͺ¨λ“ˆ(import queue)의 LifoQueue()λ₯Ό μ΄μš©ν•΄μ„œ μŠ€νƒμ„ κ΅¬ν˜„ν•˜λŠ” 방법도 μžˆλ‹€.

 

 

큐(Queue)

 

νλŠ” μž…κ΅¬μ™€ μΆœκ΅¬κ°€ λ‹€λ₯΄λ‹€. 큐의 맨 끝인 Back(λ˜λŠ” Rear)으둜 EnqueueλΌλŠ” 데이터 μž…λ ₯ ν•¨μˆ˜λ₯Ό 톡해 데이터λ₯Ό μΆ”κ°€ν•˜κ³  Frontμ—μ„œ DequeueλΌλŠ” 데이터 μ‚­μ œ ν•¨μˆ˜λ₯Ό 톡해 데이터λ₯Ό μ œκ±°ν•œλ‹€. μŠ€νƒκ³Ό λ‹€λ₯Έ 점은 λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ 데이터가 λ‚˜κ°€κΈ° λ•Œλ¬Έμ— FIFO(First In First Out, μ„ μž…μ„ μΆœ) κ΅¬μ‘°λΌλŠ” 것이닀. νŒŒμ΄μ¬μ—μ„œλŠ” collections λͺ¨λ“ˆμ— λ‚΄μž₯된 dequeλ‚˜ queue(μ‚¬μš©λ²•μ€ μŠ€νƒκ³Ό 동일)의 Queue()λ₯Ό μ΄μš©ν•΄μ„œ 큐λ₯Ό κ΅¬ν˜„ν•  μˆ˜λ„ μžˆλ‹€. 

 

from collections import deque

queue = []

# deque μ‚¬μš© X

queue.append(1)
queue.append(2)
queue.append(3)
queue.append(4)
queue.append(5)

print("- - - - - 데이터 μ‚½μž…(enqueue) - - - - -")
print(queue)
print("\n")

print("- - - - - 데이터 μ‚­μ œ(dequeue) - - - - -")
while len(queue) != 0:
    # 0번 인덱슀λ₯Ό pop
    v = queue.pop(0)
    print(v)

print()

# deque μ‚¬μš©
usingDeque = deque([1, 2, 3, 4, 5])

print("- - - - - 데이터 μ‚­μ œ(dequeue) - - - - -")
while len(usingDeque) != 0:
    v = usingDeque.popleft()
    print(v)

 

μŠ€νƒκ³Ό λ™μΌν•˜κ²Œ κ°œλ…λ§Œ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•œ μ½”λ“œμ˜ μ‹€ν–‰ κ²°κ³ΌλŠ”

 

πŸ’‘ μœ„μ—μ„œ μ„€λͺ…ν•œ νλŠ” κ°€μž₯ 기본적인 μ„ ν˜• 큐인데 μ„ ν˜• 큐의 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•œ μ›ν˜• 큐(Circular Queue)λ‚˜ 데이터가 μ •λ ¬λœ μƒνƒœμΌ λ•Œ μ‚¬μš©ν•˜λŠ” μš°μ„ μˆœμœ„ 큐(Priority Queue)도 μ‘΄μž¬ν•œλ‹€.

 

 

덱(Double-ended queue, Deque)

좜처 : https://www.programiz.com/dsa/deque

 

데이터 μ‚½μž…/μ‚­μ œκ°€ μ•žλ’€μ—μ„œ λ‹€ κ°€λŠ₯ν•˜λ‹€. μŠ€νƒκ³Ό 큐λ₯Ό 합쳐놓은 ν˜•νƒœλ‘œ μŠ€νƒμ²˜λŸΌ μ“Έ μˆ˜λ„ 있고 큐처럼 μ“Έ μˆ˜λ„ μžˆλ‹€. 데이터 μ‚½μž…/μ‚­μ œ μ‹œ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(1)이기 λ•Œλ¬Έμ— μ—°μ‚° 속도가 λΉ λ₯΄λ‹€. 크기가 가변적이기 λ•Œλ¬Έμ— μ €μž₯ν•  데이터 개수λ₯Ό λͺ¨λ₯Ό λ•Œμ—λ„ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” μž₯점도 μžˆλ‹€. collections λͺ¨λ“ˆμ˜ deque 객체λ₯Ό μ΄μš©ν•΄ κ΅¬ν˜„ν•  수 있고 μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ„œλ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

 

각각의 λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…은 여기에 잘 λ‚˜μ™€μžˆλ‹€.