본문 바로가기

study/python

스택, 큐, 덱

1) 스택(Stack)

- 데이터를 접시쌓듯이 차곡차곡 쌓는다 

- 맨 마지막에 들어온 데이터 먼저 차출됨(LIFO) 선입후출

- FILO(First In Last Out)구조로 삽입과 삭제 연산이 동일한 한군데에서 발생

- 삽입/삭제 연산에 있어 시간복잡도가 O(1)

- 이전에 활용한 데이터를 역으로 추적하거나 처음 들어온 데이터보다 나중에 들어온 데이터가 빨리나갈 때 사용

- List의 pop() 을 활용하면  Stack처럼 사용할 수 있음

- Python에서 LifoQueue라는 구현체가 있음

- 활용예시: 브라우저 뒤로가기 앞으로가기, 깊이 우선 탐색(DFS)

# 스택 직접 구현

class Stack(list):

	push = list.append
    
    def peek(self): # 가장 마지막에 있는 데이터를 보여줌(엿보다) 추출x
    	return self[-1] # 인덱스 넘버 가장 마지막
        	self[len(self) -1] #렌 함수로도 구현 가능
            
 -- pop()은 peek함수에서 가져가는 작업 추가
 스택에서 제일 마지막에 넣은 데이터를 추출하는 함수
 python 내장함수로 가지고 있음

 

2)  큐(Queue)

- 일이 처리되기를 기다리는 리스트

- FIFO(First In First Out)구조,  삽입과 삭제 연산이 서로 다른 한군데에서 발생

- 삽입/삭제 연산에 있어 시간복잡도가 O(1)

- front: 맨 처음에 들어온 데이터/ rear: 맨 마지막에 들어온 데이터

- 주로 순차적으로 진행되어야 하는 일을 스케줄링 할 때 사용됨.

- Python에서 Queue라는 구현체가 있음

- 활용 예시: 프린터 인쇄 대기열, 너비우선탐색(BFS)

  • 1) empty() : Boolean 타입
    2) is_full() : 큐가 가득 찼으면 T, 아닌 경우 F
  • 3) enqueue(data) : 큐 맨 뒤에 데이터 삽입
    4) dequeue() : 큐 맨 처음 데이터 삭제하면서 해당 데이터 반환
  • get
    5) peek() : 큐의 맨 처음 데이터 값을 삭제없이 반환(추출x)

 

※리스트를 큐처럼 사용하는 것은 안됨

리스트 주소값을 갖고 있어 w

# 직접 구현

class Queue(list)
	
    put = list.append
    
    def peek(self):
    	return self[0] # 가장 앞에 있는 데이터 보기
        
  	def get(self):
    	return self.pop(o) # pop에 파라미터 주면 해당 인덱스 값 추출

 

3) 덱(Deque)

- Queue와 Stack의 구조를 합친 것. 양쪽에서 삽입/삭제 할 수 있음

- 순서대로 처리해야 하는 일을 수행할 때, 제거해야 하는 위치가 맨끝이 아닐 때

 

from collections import deque *덱을 사용하기 위해 import

dq = deque() 
dq = deque('12345')

dq.append(6) # 오른쪽에 데이터 저장
dq.appendleft(0) # 왼쪽에서 진행하는 연산은 left를 붙임

removed = dq.pop()
print(removed)
removed = dq.popleft()
print(removed)

dq.rotate(1)
dq.rotate(-2)

코딩테스트에서는 주로 스택과 덱을 사용

'study > python' 카테고리의 다른 글

[재귀함수]  (0) 2023.02.08
input 입력 여러 개 받기  (0) 2023.02.06
삼항연산자  (0) 2023.01.28
비프시프트연산  (0) 2023.01.28
input 대신 sys.stdin.readline  (0) 2023.01.20