μ•Œκ³ λ¦¬μ¦˜

[자료ꡬ쑰] μŠ€νƒ, 큐, 데큐

mangdo 2021. 6. 22. 21:59

πŸ’‘ Stack(μŠ€νƒ)

: μŠ€νƒμ€ ν•œμͺ½ 끝으둜만 자료λ₯Ό λ„£κ³  λΊ„ 수 μžˆλŠ” 자료 ꡬ쑰이닀.

: LIFO(Last In, First Out) ꡬ쑰이닀.

μŠ€νƒ

πŸ’‘ μŠ€νƒμ˜ νŠΉμ§•

[ μž₯점 ]

    : κ΅¬μ‘°κ°€ λ‹¨μˆœν•΄μ„œ κ΅¬ν˜„이 쉽닀.

    : 데이터 μ €μž₯/읽기 속도가 λΉ λ₯΄λ‹€.

 

[ 단점 ]

1) 데이터 μ΅œλŒ€ 갯수λ₯Ό 미리 μ •ν•΄μ•Όν•œλ‹€.

   -> 데이터λ₯Ό λ¬΄ν•œμ •μœΌλ‘œ μŒ“μ„ μˆ˜λŠ” μ—†λ‹€. μŒ“κΈ°μœ„ν•΄μ„œλŠ” 미리 μ΅œλŒ€ 곡간을 ν™•λ³΄ν•΄μ•Όν•œλ‹€. 

   -> 파이썬의 경우 μž¬κ·€ν•¨μˆ˜λŠ” 1000λ²ˆκΉŒμ§€λ§Œ ν—ˆμš©ν•œλ‹€. 1000개만큼의 곡간 ν™•λ³΄ν–ˆλ‹¨ μ†Œλ¦¬κΈ°λ„ ν•˜λ‹€.

2) μ €μž₯ κ³΅κ°„μ˜ λ‚­λΉ„κ°€ λ°œμƒν•  수 μžˆλ‹€.

   -> μ΅œλŒ€ 갯수λ₯Ό 미리 μ •ν•΄μ•Όν•˜κΈ°λ•Œλ¬Έμ΄λ‹€.

 

[ μŠ€νƒ ν™œμš© ]

: ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ ꡬ쑰

더보기

ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” μƒνƒœλ₯Ό ν”„λ‘œμ„ΈμŠ€λΌκ³  ν•˜λŠ”λ° ν”„λ‘œμ„ΈμŠ€μ•ˆμ—μ„œ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” ν˜•νƒœλ‹€.

ν”„λ‘œμ„ΈμŠ€ μŠ€νƒκ΅¬μ‘°μ— recursiveν•¨μˆ˜κ°€ ν˜ΈμΆœλœκ²ƒμ„ μ €μž₯ν•œλ‹€.

 ν•¨μˆ˜μœ„에 ν•¨μˆ˜κ°€ 호좜되면 μŠ€νƒκ³Ό 같은 ꡬ쑰둜 상단에 μŒ“μΈλ‹€. ν•¨μˆ˜κ°€ μœ„λ‘œ 차곑차곑 μŒ“μ΄κ³  λ§¨μœ„μ˜ ν•¨μˆ˜λΆ€ν„° μ‚­μ œλœλ‹€. λ§¨μœ„μ˜ ν•¨μˆ˜κ°€ μ‚­μ œλ˜λ©΄(λλ‚˜λ©΄) κ·Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ λ‹€μŒ ν•¨μˆ˜κ°€ λΆˆλ €μ§€λŠ” ν˜•νƒœλ‘œ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μž‘ν•œλ‹€. 이 ν˜•νƒœλ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° κ°€μž₯ 효과적인 μžλ£Œκ΅¬μ‘°κ°€ μŠ€νƒμ΄λ‹€.

def recursive(data):
    if data<0:
        print('ended')
    else :
        print('start', data)
        recursive(data-1)
        print("returned", data)

recursive(4)
좜λ ₯κ²°κ³Ό

 

 

πŸ’‘ μŠ€νƒ κ΅¬ν˜„ν•˜κΈ°

stack_list = list()

def push(data):
    stack_list.append(data)

def pop():
    data = stack_list[-1]
    del stack_list[-1] # λ§ˆμ§€λ§‰λ°μ΄ν„°=κ°€μž₯λ‚˜μ€‘μ— λ“€μ–΄κ°„ 데이터λ₯Ό μ‚­μ œ
    return data

for index in range(10):
    push(index)

print(pop()) #9
print(stack_list)

 

πŸ’‘ νŒŒμ΄μ¬μ—μ„œ μŠ€νƒ μ‚¬μš©

data_stack = list()

data_stack.append(1)
data_stack.append(2)

print(data_stack) #[1,2]
print(data_stack.pop()) #2

 

 


πŸ’‘ Queue(큐)

: νλŠ” ν•œμͺ½ 끝으둜 자료λ₯Ό λ„£κ³ , λ°˜λŒ€μͺ½μ—μ„œλŠ” 자료λ₯Ό λΊ„ 수 μžˆλŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.

: FIFO(First In, First Out) ꡬ쑰이닀.

 

[ 큐의 ν™œμš© ]

- λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ 일을 μ²˜λ¦¬ν•΄μ•Όν•  λ•Œ 많이 μ‚¬μš©λœλ‹€.

- ex) 운영체제의 λ©€ν‹°νƒœμŠ€ν‚Ήμ„ μœ„ν•œ ν”„λ‘œμ„ΈμŠ€ μŠ€μΌ€μ€„λ§ κ΅¬ν˜„

큐

πŸ’‘ ν κ΅¬ν˜„ν•˜κΈ°

queue_list = list()

def enqueue(data):
	queue_list.append(data)

def dequeue():
	data = queue_list[0] # 맨 μ•ž 데이터 κΊΌλ‚΄κΈ°
	del queue_list[0] # 맨 μ•ž 데이터 μ‚­μ œ
	return data

for index in range(10):
	enqueue(index)
print(queue_list)

dequeue() # 0 μ‚­μ œ
dequeue() # 1 μ‚­μ œ
print(queue_list)

 

πŸ’‘ νŒŒμ΄μ¬μ—μ„œ ν μ‚¬μš©

νŒŒμ΄μ¬μ€ 큐 라이브러리λ₯Ό μ§€μ›ν•œλ‹€. 큐 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 λ³€ν˜•λœ 큐도 μ œκ³΅ν•˜κ³  μžˆλ‹€.

1. Queue() : κ°€μž₯ 일반적인 큐 자료ꡬ쑰

2. LifoQueue() : Last in, First Out(=μŠ€νƒκ΅¬μ‘°)

3. PriorityQueue() : λ°μ΄ν„°λ§ˆλ‹€ μš°μ„ μˆœμœ„λ₯Ό λ„£μ–΄μ„œ μš°μ„ μˆœμœ„λŒ€λ‘œ 좜λ ₯

import queue

# 일반적인 큐
data_queue = queue.Queue()
data_queue.put(abc)
data_queue.put(123)

data_queue.qsize() #2
data_queue.get() #abc
data_queue.get() #123

# LIFO큐
data_lifo = queue.LifoQueue()
data_lifo.put(abc)
data_lifo.put(123)
data_lifo.get() #123

# priorityQueue
data_priority = queue.PriorityQueue()
data_priority((10,"korea")) #데이터가 νŠœν”Œλ‘œ λ“€μ–΄κ°„λ‹€.
data_priority((15,"china")) 
data_priority((5,1))

data_priority.size() #3
data_priority.get() #1
data_priority.get() #korea

 

 


πŸ’‘ Deque(Double Ended Queue)

: μ–‘ λμ—μ„œ μ‚½μž…κ³Ό μ‚­μ œκ°€ κ°€λŠ₯ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

: μŠ€νƒκ³Ό 큐의 μ„±μ§ˆμ„ λͺ¨λ‘ κ°€μ§€κ³  μžˆλ‹€.

데큐

[ 데큐 μ‚¬μš©ν•˜κΈ° ]

from collections import deque

deque = deque()
deque.append(2)
deque.append(3)
deque.appendleft(1)
print(deque)

print(deque.pop())
print(deque.popleft())

 

 

 

 

 

 

좜처

슀파λ₯΄νƒ€ μ½”λ”©ν΄λŸ½ μ•Œκ³ λ¦¬μ¦˜ κ°•μ˜

패슀트캠퍼슀 μ•Œκ³ λ¦¬μ¦˜ κ°•μ˜

λ‚˜λ¬΄μœ„ν‚€ : 큐