큐의 선입선출 구조
큐의 기본 연산
연산 | 기능 |
---|---|
enQueue(item) | 큐의 뒤쪽(rear 다음)에 원소를 삽입하는 연산 |
deQueue() | 큐의 앞쪽(front)에서 원소를 삭제하고 반환하는 연산 |
createQueue() | 공백 상태의 큐를 생성하는 연산 |
isEmpty() | 큐가 공백상태인지를 확인하는 연산 |
isFull() | 큐가 포화상태인지를 확인하는 연산 |
Qpeek() | 큐의 앞쪽(front)에서 원소를 삭제 없이 반환하는 연산 |
1) 공백 큐 생성 : createQueue()
2) 원소 A 삽입 : enQueue(A)
3) 원소 B 삽입 : enQueue(B)
4) 원소 반환/삭제 : deQueue()
5) 원소 C 삽입 : enQueue(C)
6) 원소 반환/삭제 : deQueue()
7) 원소 반환/삭제 : deQueue()
선형큐
초기 공백 큐 생성
삽입 : enQueue(item)
마지막 원소 뒤에 새로운 원소를 삽입하기 위해
1) rear 값을 하나 증사시켜 새로운 원소를 삽입할 자리를 마련
2) 그 인덱스에 해당하는 배열원소 Q[rear]에 item을 저장
def enQueue(item) :
global rear
if isFull() : print("Queue_Full")
else :
rear <- rear + 1
Q[rear] <- item
삭제 : deQueue()
def deQueue()
if(isEmpty()) then Queue_Empty()
else
front <- front + 1
return Q[front]
공백상태 및 포화상태 검사 : isEmpty(), isFull()
def isEmpty() :
return front == rear
def isFull() :
return rear == len(Q) - 1
검색 : Qpeek()
def Qpeek() :
if isEmpty() : print("Queue_Empty")
else : return Q[front+1]
잘못된 포화상태 인식
해결방법 1
해결방법 2
삽입 위치 | 삭제 위치 | |
---|---|---|
선형큐 | rear = rear + 1 | front = front + 1 |
원형큐 | rear = (rear + 1) mod n | front = (front + 1) mod n |
1) create Queue
2) enQueue(A)
3) enQueue(B)
4) deQueue()
5) enQueue(C)
6) enQueue(D)
def isEmpty() :
return front == rear
def isFull() :
return (rear+1) % len(cQ) == front
def enQueue(item) :
global rear
if isFull() :
print("Queue_Full")
else :
rear = (rear + 1) % len(cQ)
cQ[rear] = item
def deQueue() :
global front
if isEmpty() :
print("Queue_Empty")
else :
front = (front + 1) % len(cQ)
return cQ[front]
def isEmpty() :
return front == rear
def isFull() :
return (rear+1) % len(cQ) == front
1) 공백 큐 생성 : createLinkedQueue()
2) 원소 A 삽입 : enQueue(A)
3) 원소 B 삽입 : enQueue(B)
4) 원소 삭제 : deQueue()
5) 원소 C 삽입 : enQueue(C)
6) 원소 삭제 : deQueue()
7) 원소 삭제 : deQueue()
from collections import deque
q = deque()
q.append(1) # enqueue()
t = q.popleft() # dequeue()
우선순위 큐의 특성
우선순위 큐의 적용 분야
우선순위 큐의 구현
우선순위 큐의 기본 연산
그래프를 탐색하는 방법에는 크게 두 가지가 있음
너비우선탐색은 탐색 시작점의 인접한 정점들을 먼저 모두 차례로 방문한 후에, 방문했던 정점을 시작점으로 하여 다시 인접한 정점들을 차례로 방문하는 방식
인접한 정점들에 대해 탐색을 한 후, 차례로 다시 너비우선탐색을 진행해야 하므로, 선입선출 형태의 자료구조인 큐를 활용함
BFS는 예제 그래프를 아래와 같은 순서로 탐색함
def BFS(G, v): # 그래프 G, 탐색 시작점 v
visited = [0]*(n+1) # n : 정점의 개수
queue = [] # 큐 생성
queue.append(v) # 시작점 v를 큐에 삽입
while queue: # 큐가 비어있지 않은 경우
t = queue.pop(0) # 큐의 첫번째 원소 반환
if not visited[t]: # 방문되지 않은 곳이라면
visited[t] = True # 방문한 것으로 표시
visit(t) # 정점 t에서 할 일
for i in G[t]: # t와 연결된 모든 정점에 대해
if not visited[i]: # 방문되지 않은 곳이라면
queue.append(i) # 큐에 넣기