알고리즘 기초 입문을 위해 공부한 DO IT! 자료구조와 함께 배우는 알고리즘 입문 : 파이썬편을 통해 새로 알게 된 내용을 정리한다.
: 데이터를 임시저장하는 자료구조(LIFO : Last In First Out)
: push, pop, clear 등 대부분 메서드에 계속 사용된다. 즉, 스택의 맹점은 '스택 포인터'
[Push]
self.stack[ptr] = value
ptr+=1
[Pop]
self.ptr -=1
return self.stack[ptr]
[Clear]
self.ptr = 0
: 표준 라이브러리로 이를 사용하여 stack 구현 가능
: 맨 앞과 맨 끝 양쪽에서 데이터 삽입, 삭제가 가능하다.
: 데이터를 임시저장하는 자료구조(FIFO)
: 일반 큐 자료구조의 dequeue는 가장 앞의 원소를 빼고 뒤의 원소들을 다 앞으로 당겨줘야해서 복잡도가 O(n)이다.
: 이를 해결하기 위해, 고리 형태의 큐(=링버퍼)를 고안했다.
: 링버퍼에서 enqueue, dequeue의 복잡도는 모두 O(1)이다.
1) que : 큐 배열
2) capacity
3) front, rear
: rear은 다음 인큐할 데이터를 저장하는 원소 인덱스
: 둘 다 0으로 초기화
4) no
: 큐의 데이터 개수
: front와 rear의 값이 같을 경우 큐가 비었는지 꽉 차있는지 구별하기 위해
def __init__(self, capacity:int = 256) ->None:
self.capacity = capacity
self.que = [None] * capacity
self.front = 0
self.rear = 0
self.no = 0
def enque(self, value:Any) -> None:
# 1. 꽉 차있는 지 본다
if self.isFull():
raise FixedQueue.Full
# 2. 넣어준다
self.que[self.rear] = value
# 3. rear, no을 올린다.
self.rear+=1
self.no +=1
# 4. rear가 마지막 원소까지 도달했으면 다시 0으로!
if self.rear == self.capacity :
self.rear = 0
def deque(self) -> Any :
# 1. 비었는 지 본다
if self.isEmpty():
raise FixedQueue.Empty
# 2. 뺀다.
target = self.que[self.front]
# 3. front +1, no -1
self.front +=1
self.no -=1
# 4. front가 마지막 원소에 도달하면 다시 0으로!
if self.front == self.capacity :
self.front = 0
return target
def clear(self) -> None:
self.no = self.front = self.rear = 0
: 인큐할 때 데이터에 우선순위를 부여하고, 디큐할 때 우선순위에 따라 데이터를 꺼낸다.
: heapq모듈에서 제공한다.