2. 큐 (Queue) 개념
큐 (Queue)
데이터의 삽입과 삭제가 다른 곳에서 이루어지는 일정의 리스트
FIFO (First In First Out)
데이터 삽입이 일어나는 곳을 rear, 데이터 삭제가 일어나는 곳을 front라고 함
예: 프린터 스풀러, CPU 스케줄링, 서점에서 줄서기 등
큐를 구현하는 대표적인 방법: 배열을 이용하는 방법, 연결 리스트를 이용하는 방법
rear
front
큐 (Queue)
3. CPU 스케줄링
Multi-tasking 환경에서 CPU 자원이 필요한 프로세스들을 큐에 저장
데이터 버퍼
컴퓨터에서 프린터로 도착된 데이터를 순서대로 저장하여 처리
네트워크로 부터 전달받은 패킷을 순서대로 저장하여 처리
통신 네트워크 모델링과 시뮬레이션
네트워크의 노드와 연결로 구성된 네트워크 모델링과 시뮬레이션에 활용
큐 (Queue) 개념
큐의 응용
4. 큐 (Queue): 개 요
큐 연산 예
enque(10);
enque(20);
enque(30);
deque();
enqueue:
dequeue:
isempty:
큐의 rear를 통해 데이터를 삽입하는 연산
큐의 front를 통해 큐에서 데이터를 삭제하는 연산
큐가 비었는지 검사하는 연산
front: 큐의 front 에 있는 데이터를 삭제하지 않고 데이터를 얻는 연산
frontrear
102030
Queue
5. 큐 (Queue): 개 요
frontrear Queue
top
push()
pop()
enqueue() dequeue()
스택과 큐
6. Deque (Double Ended Queue)
큐의 양 끝에서 데이터의 삽입과 삭제가 허용되는 큐
“덱” 또는 “디큐” 라고 함
우선순위 큐 (Priority Queue)
큐에 들어온 순서와 무관하게 우선순위 (큰 값 혹은 작은 값)에 따라 가장
먼저 꺼내지는 큐
대표적인 구현 방법으로 이진 힙(binary heap)이 있음
큐 (Queue): 개 요
큐의 변형
7. 큐에서 데이터 삽입은 rear에서 삭제는 front에서 일어남
연결리스트로 큐를 구현할 때 연결리스트의 앞을 front, 뒤를 rear로
설정하는 것이 유리
삽입을 하기 위해서 마지막 노드의 주소를 기억해야 함
연결리스트로 큐 구현
연결리스트로 구현
int
link
10 int
link
20 int
link
30 int
link
40
NULL
QNode QNode QNode QNode
Queue
rear
front
size 4
8. 연결리스트를 이용한 큐 구현
queue.h 큐와 관련하여 구현한 함수의 프로토타입
struct queue *를 Queue 라는 자료형을
재 정의
Queue라는 자료형은 포인터 변수를 뜻함
Item의 자료형을 다른 자료형으로 수정하면
Queue를 그대로 사용 가능
9. 연결리스트로 큐 구현
typedef struct QNode {
Item data;
QNode *link;
} QNode;
typedef struct {
QNode *front;
QNode *rear;
int size;
} Queue;
typedef int Item;
queue.h: data for queue implementation
14. 배열로 큐 구현
배열로 큐를 구현할 때 문제점
초기상태(front = -1, rear = -1)
10 삽입 10
rear
20 삽입 10 20
rear
30 삽입 10 20 30
rear
40 삽입 10 20 30 40
rear
3번 deQueue 40 50
50 삽입 10 20 30 40 50
rear
Full
rearfront
Full 로 인지
( Not Empty)
2번 deQueue
rearfront
Full 로 인지
(Empty)
배열의 index를 더 증가시키지 못해서 빈 공
간이 있는데도 불구하고 데이터 저장을 못함
15. 배열로 큐 구현
원형 큐
초기상태
rearfront
10 삽입 10
rearfront
20 삽입 10 20
rearfront
10 20 30
rearfront
10 20 30 40
rearfront
30 삽입
40 삽입 Full
40
rearfront
3번 deQueue
rearfront
1번 deQueue
50 삽입 50
50 60 70
50 60 70 80
60/70 삽입
80 삽입
rear front
front
front
rear
rear
16. 배열로 큐 구현
원형 큐
알고리즘 고찰
front와 rear의 값 처리
front = (front + 1) % ARRAY_SIZE;
rear = (rear + 1) % ARRAY_SIZE:
비어 있다는 것을 아는 방법은 ?
front와 rear 가 같은 값을 가지는 경우
return front == rear
차 있다는 것을 아는 방법은 ?
(rear + 1) % ARRAY_SIZE == front
17. 배열로 큐 구현
원형큐: cqueue.h
원형 큐의 저장 공간
원형 큐 관련 정보
원형큐 포인터 변수 타입 재 정의
원형큐 관련 함수의 프로토타입
19. 배열로 큐 구현
deleteCircularQueue 함수 ..
원형 큐 데이터 영역 해제
원형 큐 정보 저장 영역 해제
원형 큐 데이터가 저장될 rear 값 설정
원형 큐에 데이터 저장
원형 큐 데이터가 저장될 front 값 설정
원형 큐에 저장된 데이터의 수 감소
원형 큐의 데이터 반환
원형 큐에 저장된 데이터의 수 감소
20. 배열로 큐 구현
front 값 변경없이 원형 큐의 데이터 반환
front 값과 rear 값이 같은 경우 원형 큐는 비워있음
rear값이 front 값보다 1 작으면 포화상태임
front, rear, size 값을 초기화
size 값을 반환
front 함수..