공부했던 자료 정리하는 용도입니다.
재배포, 수정하지 마세요.
큐(Queue)
- 선입선출(FIFO: First-In First-Out) 입출력 형태를 갖는다.
- 삽입과 삭제가 일어나는 위치가 다르다.
= 삽입과 삭제가 큐의 양 끝에서 일어난다.
rear(후단) : 큐에서 삽입이 일어나는 곳
front(선단) : 큐에서 삭제가 일어나는 곳
큐의 연산
객체 : 0개 이상의 요소들로 구성된 선형 리스트
연산 :
create(max_size) ::= 최대 크기가 max_size인 공백 큐를 생성
init(q) ::= 큐 초기화
is_empty(q) ::=
if(size == 0) return TRUE;
else return FALSE:
is_full(q) ::=
if(size == max_size) return TRUE;
else return FALSE;
enqueue(q, e) ::=
if(is_full(q)) ERROR_QUEUE_FULL;
else q의 끝에 e를 추가
dequeue(q) ::=
if(is_empty(q)) ERROR_QUEUE_EMPTY;
else q의 맨 앞에 있는 e를 제거하여 반환
peek(q) ::=
if(is_empty(q)) ERROR_QUEUE_EMPTY;
else q의 맨 앞에 있는 e를 읽어서 반환
enqueue(Q, x) ::=
rear<-(rear + 1) % MAX_QUEUE_SIZE; // 배열 크기를 넘어가지 않게 하기 위해 큐 사이즈로 나눠줌
Q[rear]<-x;
dequeue(Q) ::=
front<-(front + 1) % MAX_QUEUE_SIZE;
return Q[front];
원형 큐일 경우 삽입과 삭제 알고리즘이 달라진다.
- enqueue : 삽입 연산. 큐의 맨 뒤에 새로운 요소를 추가
- dequeue : 삭제 연산. 큐의 맨 앞에 있는 요소가 삭제되면서 반환
- peek : 맨 앞에 있는 요소를 읽어서 반환 (삭제가 일어나지 X)
- is_empty : 큐가 공백 상태인지 검사
- is_full : 큐가 포화 상태인지 검사
- create : 큐 생성
- init : 큐 초기화
큐의 종류
- 선형 큐(linear queue)
- front와 rear이 증가만 하기 때문에 경우에 따라 배열의 앞부분을 사용할 수 없음
- 주기적으로 모든 요소를 앞쪽으로 이동시켜야 하기 때문에 비효율적 - 원형 큐(circular queue)
선형 큐의 단점을 보완하기 위해 처음과 끝을 연결한 개념.
공백 상태 : ``front == rear``
포화 상태 : front가 rear보다 한 칸 앞에 있는 경우
- 공백상태와 포화상태를 구분하기 위한 방법
1. 항상 큐의 한자리 이상을 비우기
2. 원소의 개수를 저장하는 변수를 지정
큐의 응용
- 버퍼
- 인쇄 작업 큐
- 운영체제의 작업 스케줄링
대기 행렬 이론, 큐잉 이론(queueing theory)
: 대기 행렬을 수학적으로 다루는 이론. 경영관리, 산업공학, 통신 네트워크의 성능 분석 및 설계(패킷 스케줄링 정책, 자원관리)등 여러 분야에서 사용한다.
덱(Deque, double-ended queue)
큐의 전단(front) 후단(rear)에서 모두 삽입과 삭제가 가능한 큐를 의미한다.
덱의 연산
객체 : n개의 element형의 요소들의 순서 있는 모임
연산 :
create() ::= 덱 생성
init(dq) ::= 덱 초기화
is_empty(dq) ::= 덱이 공백상태인지 검사
is_full(dq) ::= 덱이 포화상태인지 검사
add_front(dq, e) ::= 덱의 앞에 요소 추가
add_rear(dq, e) ::= 덱의 뒤에 요소 추가
delete_front(dq) ::= 덱의 앞에 있는 요소를 반환한 다음 삭제
delete_rear(dq) ::= 덱의 뒤에 있는 요소를 반환한 다음 삭제
get_front(dq) ::= 덱의 앞에 있는 요소를 삭제하지 않고 반환
get_rear(dq) ::= 덱의 뒤에 있는 요소를 삭제하지 않고 반환
- add_front : 덱의 앞에 요소를 추가
- add_rear : 덱의 뒤에 요소를 추가
- delete_front : 덱의 앞에 있는 요소가 삭제되면서 반환
- delete_rear : 덱의 뒤에 있는 요소를 삭제되면서 반환
- get_front : 덱의 앞에 있는 요소를 반환 (삭제되지 X)
- get_rear : 덱의 뒤에 있는 요소를 반환 (삭제되지 X)
- is_empty : 덱이 공백 상태인지 검사
- is_full : 덱이 포화 상태인지 검사
- create : 덱 생성
- init : 덱 초기화
덱의 연산 비교
덱은 스택과 큐의 연산들을 모두 가지고 있다.
스택(stack) | 큐(queue) | 덱(deque) | |
앞에서 삽입 | add_front | ||
앞에서 삭제 | dequeue | delete_front | |
뒤에서 삽입 | push | enqueue | add_rear |
뒤에서 삭제 | pop | delete_rear |
'기타 > 자료구조' 카테고리의 다른 글
[자료구조] 우선순위 큐(priority queue), 힙(heap) (0) | 2021.07.17 |
---|---|
[자료구조] 트리, 이진 트리, 이진 탐색 트리 (0) | 2021.06.18 |
[자료구조] 스택(Stack) (0) | 2021.01.26 |
순환 알고리즘 (0) | 2021.01.25 |
알고리즘 성능분석 (0) | 2021.01.22 |