Computer Science/Data Structures

πŸ”stack & queue & deque

metamong 2022. 9. 23.

🧜‍♀️stack / queue / deque λͺ¨λ‘ νŠΉμ • μœ„μΉ˜μ—μ„œλ§Œ μ›μ†Œλ₯Ό λ„£κ±°λ‚˜ λΊ„ 수 μžˆλŠ” restricted structure

1. stack

🧜‍♀️ μŠ€νƒμ΄λž€, ν•œ μͺ½μœΌλ‘œλ§Œ 데이터λ₯Ό λΉΌκ³  넣을 수 μžˆλŠ” 자료ꡬ쑰둜, ν•œ μͺ½λ§Œ ꡬ멍이 뚫렀 μžˆλŠ” ν”„λ§κΈ€μŠ€ 톡을 μƒκ°ν•˜λ©΄ λœλ‹€. λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ‚˜μ€‘μ— λ‚˜κ°€λŠ” ν˜•μ‹ - 즉 λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ν˜•μ‹(μ„ μž…ν›„μΆœ FILO)의 자료ꡬ쑰. μž…κ΅¬μ™€ μΆœκ΅¬κ°€ λ™μΌν•œ ν˜•νƒœλ‘œ 맀우 κ°„λ‹¨ν•œ 두 μ—°μ‚°(μ›μ†Œ μΆ”κ°€ O(1), μ›μ†Œ 제거 O(1))이 μ œκ³΅λœλ‹€. 제일 μƒλ‹¨μ˜ μ›μ†Œ 확인은 O(1), 제일 상단이 μ•„λ‹Œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ˜ 확인/변경은 μ›μΉ™μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€. 항상 μŠ€νƒ μƒλ‹¨μ—λ§Œ 초점이 λ˜μ–΄ 있음. λ”°λΌμ„œ μ‚½μž…ν•  λ•Œμ—λ„ κ°€μž₯ μ΅œκ·Όμ— μ‚½μž…ν•œ μ›μ†Œ λ°”λ‘œ μœ„μ— μ‚½μž…μ΄ 되고, μ‚­μ œν•  λ•Œλ„ κ°€μž₯ μ΅œκ·Όμ— μ‚½μž…ν•œ μ›μ†Œκ°€ μ‚­μ œλœλ‹€. λ”°λΌμ„œ μŠ€νƒμ€ 제일 상단에 μ›μ†Œ μΆ”κ°€ & 제일 상단 μ›μ†Œ 제거 & 제일 상단 μ›μ†Œ 확인 - μ΄λ ‡κ²Œ 3가지 연산이 μ£Όκ°€ λœλ‹€. λ”°λΌμ„œ μŠ€νƒ ν™œμš© λ¬Έμ œλŠ” 제일 상단이 μ•„λ‹Œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ˜ 확인/변경은 ν•„μš” x.

(쒌) Cλ₯Ό 상단에 λ„£κ³  상단에 뺌 / (우) 30을 상단에 λ„£κ³  12λ₯Ό 상단에 λ„£κ³  12λ₯Ό 뺌

 

🧜‍♀️ python으둜의 κ΅¬ν˜„μ€ listλ₯Ό ν™œμš©ν•΄μ„œ κ°€λŠ₯. 제일 상단을 list의 였λ₯Έμͺ½ 끝이라 보고, 제일 상단에 μ›μ†Œ μΆ”κ°€λŠ” append(), 제일 상단 μ›μ†Œ μ œκ±°λŠ” pop(), 제일 상단 μ›μ†Œ 확인은 arr[-1]을 ν™œμš©ν•΄μ„œ κ°€λŠ₯ - λͺ¨λ‘ μ‹œκ°„λ³΅μž‘λ„ O(1)둜 맀우 λΉ λ₯Έ μ‹œκ°„ 내에 operation μˆ˜ν–‰ κ°€λŠ₯. 예λ₯Ό λ“€μ–΄ μ‚½μž… 5 - μ‚½μž… 2 - μ‚½μž… 3 - μ‚½μž… 7 - μ‚­μ œ - μ‚½μž… 1 - μ‚½μž… 4 - μ‚­μ œ 순으둜 stack 연산을 κ΅¬ν˜„ν•œλ‹€λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

stack = []

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

print(stack[::-1]) #print from the topmost [1, 3, 2, 5]
print(stack) #print from the bottommost [5, 2, 3, 1]

2. queue

🧜‍♀️ 큐(queue)λŠ” μŠ€νƒκ³Ό λ‹€λ₯΄κ²Œ λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λ‚˜κ°€λŠ” ν˜•μ‹(μ„ μž…μ„ μΆœ FIFO)의 μžλ£Œκ΅¬μ‘°μ΄λ‹€. μ΄λŠ” μž…κ΅¬μ™€ μΆœκ΅¬κ°€ λͺ¨λ‘ 뚫렀 μžˆλŠ” 터널과 같은 ν˜•νƒœλ‘œ μ•„λž˜μ™€ 같이 μ‹œκ°ν™”ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ λ¨Όμ € λ“€μ–΄μ˜¨ μ‚¬λžŒμ΄ λ¨Όμ € μ²˜λ¦¬λ˜λŠ” λŒ€κΈ°μ—΄μ„ κ΅¬ν˜„ν•  λ•Œ νλΌλŠ” 자료ꡬ쑰λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. ν•œμͺ½ λμ—μ„œ μ›μ†Œλ₯Ό λ„£κ³  λ°˜λŒ€μͺ½ λμ—μ„œ μ›μ†Œλ₯Ό λΊ„ 수 μžˆλŠ” 자료ꡬ쑰. ν•œ μͺ½ μ›μ†Œ μΆ”κ°€ O(1), κ·Έ λ°˜λŒ€μͺ½ μ›μ†Œ 제거 O(1), λ˜ν•œ 제일 μ•žκ³Ό λ’€ μ›μ†Œ 각각 확인은 O(1)이며 제일 μ•ž/λ’€κ°€ μ•„λ‹Œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ˜ 확인/변경은 μ›μΉ™μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€. μŠ€νƒκ³Ό λ‹€λ₯΄κ²Œ λ‚˜κ°€κ³  λ“€μ–΄μ˜€λŠ” μž…κ΅¬/μΆœκ΅¬κ°€ λ‹€λ₯΄μ§€λ§Œ, 곡톡점은 λͺ¨λ‘ 좜/μž… κ΄€λ ¨ μ—†λŠ” μ›μ†Œλ“€μ˜ 확인/변경은 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 점. 

(쒌) 3 4 5 순 λ¨Όμ € ν•œμͺ½μ— λ“€μ–΄κ°€κ³  λ‚˜μ˜¬ λ•ŒλŠ” 1 2 순 λ‹€λ₯Έμͺ½μ—μ„œ λ‚˜κ°„λ‹€ (우) 30이 ν•œ μͺ½μ— λ“€μ–΄κ°€κ³  λ¨Όμ € λ“€μ–΄κ°€ 있던 26이 λ‹€λ₯Έμͺ½μœΌλ‘œ λ‚˜κ°„λ‹€.

 

🧜‍♀️ python으둜의 κ΅¬ν˜„μ€ collections λͺ¨λ“ˆμ˜ deque() ν•¨μˆ˜λ₯Ό ν™œμš©ν•΄μ„œ κ°€λŠ₯. 였λ₯Έμͺ½ λ’€μͺ½μ—μ„œ μ›μ†Œλ₯Ό 넣을 λ•ŒλŠ” append(), μ™Όμͺ½ μ•žμͺ½μ—μ„œ μ›μ†Œλ₯Ό λΊ„ λ•ŒλŠ” popleft()(κ·Έ λ°˜λŒ€λ‘œ μ•žμͺ½μ—μ„œ μ›μ†Œλ₯Ό λ„£κ³  μ‹Άλ‹€λ©΄ appendleft(), 였λ₯Έμͺ½ λ’€μͺ½μ—μ„œ μ›μ†Œλ₯Ό λΉΌκ³  μ‹Άλ‹€λ©΄ pop() μ‚¬μš© κ°€λŠ₯. λ‹€λ§Œ, queueλŠ” λ“€μ–΄μ˜€κ³  λ‚˜κ°€λŠ” λ°©ν–₯의 ν™”μ‚΄ν‘œκ°€ λ™μΌν•˜λ‹€λŠ” 점) append(), appendleft(), pop(), popleft() λͺ¨λ‘ μ‹œκ°„λ³΅μž‘λ„ O(1). 예λ₯Ό λ“€μ–΄ μ‚½μž… 1 - μ‚½μž… 2 - λΉΌκΈ° 1 - λΉΌκΈ° 2 - μ‚½μž… 3 - μ‚½μž… 4 - μ‚½μž… 5 μˆœμ„œλŠ” μ•„λž˜μ™€ 같이 μ½”λ“œλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

from collections import deque

queue = deque()

queue.appendleft(1)
queue.appendleft(2)
queue.pop()
queue.pop()
queue.appendleft(3)
queue.appendleft(4)
queue.appendleft(5)
print(queue) #deque([5, 4, 3])

3. deque

🧜‍♀️ 덱(deque)μ΄λž€, 큐와 λ‹€λ₯΄κ²Œ μ–‘μͺ½ λμ—μ„œ μ‚½μž…κ³Ό μ‚­μ œκ°€ μ „λΆ€ κ°€λŠ₯ν•œ 자료ꡬ쑰. Double-Ended queue의 μ€„μž„λ§. μ›μ†Œμ˜ μΆ”κ°€ / 제거 λͺ¨λ‘ O(1), 제일 μ•ž/λ’€μ˜ μ›μ†Œ 확인은 O(1), 제일 μ•ž/λ’€κ°€ μ•„λ‹Œ λͺ¨λ“  μ›μ†ŒλŠ” μ›μΉ™μ μœΌλ‘œ λ³€κ²½/μ ‘κ·Ό λΆˆκ°€λŠ₯. 이 λ•Œ queue와 λ‹€λ₯Έ 점은 μ–‘μͺ½ 끝 λͺ¨λ‘μ—μ„œ 자유둭게 λ„£κ³  λΊ„ 수 μžˆλ‹€λŠ” 점. 

(우) μ™Όμͺ½μ—μ„œ 17 μ‚½μž… - 였λ₯Έμͺ½μ—μ„œ 86 제거 - 였λ₯Έμͺ½μ—μ„œ 30 μ‚½μž… - μ™Όμͺ½μ—μ„œ 17 제거

 

🧜‍♀️ python으둜의 κ΅¬ν˜„μ€ μœ„ queue와 λ§ˆμ°¬κ°€μ§€λ‘œ collections의 deque() ν™œμš©. μœ„ queue()와 λ™μΌν•˜κ²Œ append(), appendleft(), pop(), popleft() μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. ν‰μ†Œ list의 ν•¨μˆ˜λ‘œ 많이 μ“°λŠ” index(), insert(), remove(), count(), reverse() μ‚¬μš© κ°€λŠ₯. 1κ°œκ°€ μ•„λ‹Œ 2개 μ΄μƒμ˜ μ›μ†Œλ₯Ό λ™μ‹œμ— λ„£λŠ” extend(), extendleft()도 μ‚¬μš© κ°€λŠ₯ν•˜λ©° μ§€μ •ν•œ μΉΈ 만큼 μ›€μ§μ΄λŠ” rotate() ν•¨μˆ˜λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ deque([1, 2, 3, 4, 5])κ°€ μžˆλ‹€λ©΄ rotate(2)λ₯Ό ν•  경우 μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 2μΉΈ 움직이고 였λ₯Έμͺ½μ—μ„œ 빠진 μ›μ†ŒλŠ” λŒμ•„μ„œ μ™Όμͺ½μœΌλ‘œ λ“€μ–΄κ°„λ‹€. deque([5, 4, 1, 2, 3])이 λœλ‹€. λ°˜λŒ€ λ°©ν–₯은 rotate(-2)이고 μ‹œκ°„ λ³΅μž‘λ„λŠ” O(k) (k개의 μ›μ†Œ 움직인닀면) 예λ₯Ό λ“€μ–΄ 86κ³Ό 23, 17을 μ°¨λ‘€λŒ€λ‘œ μ™Όμͺ½μ— λ„£κ³ , 였λ₯Έμͺ½μ—μ„œ 86을 λΊ€ λ’€ 였λ₯Έμͺ½μ—μ„œ 30을 λ„£κ³  μ™Όμͺ½μ—μ„œ 17을 λΉΌλŠ” 과정은 μ•„λž˜μ™€ 같이 μ½”λ“œλ‘œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

from collections import deque

deque = deque()

deque.appendleft(86)
deque.appendleft(23)
deque.appendleft(17)
deque.pop()
deque.append(30)
deque.popleft()
print(deque) #deque([23, 30])

 

🧜‍♀️ array와 deque을 λΉ„κ΅ν•˜μžλ©΄ arrayλŠ” 쀑간에 μžˆλŠ” λͺ¨λ“  μ›μ†Œλ“€λ„ O(1)에 랜덀 μ ‘κ·Ό κ°€λŠ₯. ν•˜μ§€λ§Œ deque은 μ–‘ 끝의 μ›μ†Œ 1κ°œμ”©μ˜ deletion, insertion이 O(1)인 자료ꡬ쑰(ν•˜μ§€λ§Œ arrayλŠ” μ‚½μž…κ³Ό λΉΌλ‚΄κΈ° μ—°μ‚° λͺ¨λ‘ O(n)). ν•˜μ§€λ§Œ deque의 νŠΉμ • μ›μ†Œ 접근은 O(n). λ”°λΌμ„œ deque은, deque에 μ–΄λ–€ μ›μ†Œκ°€ λ“€μ–΄κ°”λŠ”μ§€ μƒκ΄€ν•˜μ§€ μ•Šκ³  νŠΉμ • μˆœμ„œλŒ€λ‘œ 데이터λ₯Ό 집어넣고 λΉΌλ‚΄λŠ” 연산을 원할 λ•Œ 많이 μ“°μž„.


μ΄μ½”ν…Œ 2021

BaaarkingDog

 

'Computer Science > Data Structures' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

set() & dict() - 집합과 맡  (0) 2023.08.03
Binary heap  (0) 2023.02.06
Types of Binary Tree🌲  (0) 2023.01.10
priority queue(binary heap)  (0) 2023.01.09
hash table / hashing  (0) 2022.11.06

λŒ“κΈ€