queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-dsa/slides/03_queue.pdf · 2018. 3. 8. · 주제...
TRANSCRIPT
QueueData Structures and Algorithms
목차• 큐의이해와 ADT 정의
• 큐의배열기반구현
• 큐의연결리스트기반구현
• 큐의활용
• 덱(Deque)의 이해와구현
Data Structures and Algorithms 2
큐의이해와 ADT 정의
Data Structures and Algorithms 3
큐(Stack)의이해와 ADT 정의• 큐는 ‘LIFO(Last-in, First-out) 구조’의자료구조• 먼저들어간것이먼저나오는구조
• 큐의기본연산• Enqueue: 큐에데이터를넣는연산• Dequeu: 큐에서데이터를꺼내는연산
Data Structures and Algorithms 4
큐의 ADT 정의• 배열 또는 연결리스트 기반 큐
Data Structures and Algorithms 5
enqueue 연산
dequeue 연산
peek 연산
큐의배열기반구현
Data Structures and Algorithms 6
큐의 동작
Data Structures and Algorithms 7
enqueue 연산 dequeue 연산
• 큐의 꼬리(R)을 한칸 이동 후새 데이터 저장
• 큐의 머리(F)가 가리키는 데이터반환 후 F를 한 칸 이동
배열 기반 큐의 문제점• Dequeue 동작으로배열이비더라도인덱스이상증가불가• 데이터추가를위해 R을인덱스 0위치로이동해야함
Data Structures and Algorithms 8
원형큐• 배열의머리와끝을연결한구조
Data Structures and Algorithms 9
원형 큐의 단순한 연산• R이 이동한 다음에 데이터 저장
• F가 가리키는 데이터 반환 후 F 이동
Data Structures and Algorithms 10
원형큐의단순한연산의문제점
Data Structures and Algorithms 11
full
empty
원형큐의문제점해결• 초기화: F와 R이같은위치를가리킴
• R이 F를가리키려고하면 Full
Data Structures and Algorithms 12
원형큐의구현: 헤더파일
Data Structures and Algorithms 13
#define�QUE_LEN�100
typedef int Data;
typedef struct _cQueue
{
int front;
int rear;
Data�queArr[QUE_LEN];
}�CQueue;
typedef CQueue Queue;
void�QueueInit(Queue�*�pq);
int QIsEmpty(Queue�*�pq);
void Enqueue(Queue *�pq,�Data�data);
Data�Dequeue(Queue�*�pq);
Data�QPeek(Queue�*�pq);
queArr
원형큐의구현: Helper Function• 큐의 연산에 의해서 F(front)와 R(rear)이 이동할때 이동해야할 위치를 알려주는 함수
Data Structures and Algorithms 14
int NextPosIdx(int pos){
if(pos ==�QUE_LEN-1)return 0;
elsereturn pos+1;
}
원형큐의구현: 함수정의1
Data Structures and Algorithms 15
void QueueInit(Queue�*�pq){
pq->front�=�0;pq->rear�=�0;
}
int QIsEmpty(Queue�*�pq){
if(pq->front�==�pq->rear)return TRUE;
elsereturn FALSE;
}
원형큐의구현: 함수정의2
Data Structures and Algorithms 16
void Enqueue(Queue�*�pq,�Data�data){ // rear이동 후 데이터 저장
if(NextPosIdx(pq->rear)�==�pq->front){
printf("Queue�Memory�Error!");exit(-1);
}
pq->rear�=�NextPosIdx(pq->rear);pq->queArr[pq->rear]�=�data;
}
Data�Dequeue(Queue�*�pq){
if(QIsEmpty(pq)){
printf("Queue�Memory�Error!");exit(-1);
}// front�이동 후 데이터 반환pq->front�=�NextPosIdx(pq->front);return pq->queArr[pq->front];
}
큐의연결리스트기반구현
Data Structures and Algorithms 17
연결리스트기반큐의헤더파일• 연결리스트기반스택의응용
Data Structures and Algorithms 18
typedef int Data;
typedef struct _node{
Data�data;struct _node�*�next;
}�Node;
typedef struct _lQueue{
Node�*�front;Node�*�rear;
}�LQueue;
typedef LQueue Queue;
void QueueInit(Queue�*�pq);int QIsEmpty(Queue�*�pq);
void Enqueue(Queue�*�pq,�Data�data);Data�Dequeue(Queue�*�pq);Data�QPeek(Queue�*�pq);
연결리스트기반큐의구현: 초기화
Data Structures and Algorithms 19
void QueueInit(Queue�*�pq){
pq->front�=�NULL;pq->rear�=�NULL;
}
int.�QIsEmpty(Queue�*�pq){
if(pq->front�==�NULL)return TRUE;
elsereturn FALSE;
}
연결리스트기반큐의구현: enqueue
Data Structures and Algorithms 20
void Enqueue(Queue�*�pq,�Data�data){
Node�*�newNode =�(Node*)malloc(sizeof(Node));newNode->next�=�NULL;newNode->data�=�data;
if(QIsEmpty(pq)){
pq->front�=�newNode;pq->rear�=�newNode;
}else{
pq->rear->next�=�newNode;pq->rear�=�newNode;
}}
enqueue
enqueue
F와 R 변경
R만 변경
연결리스트기반큐의구현: dequeue• F가다음노드를가리킴, 이전노드삭제
• F가다음노드를가리킴, 이전노드삭제
Data Structures and Algorithms 21
R은 no-operation
연결리스트기반큐의구현: dequeue 정의
Data Structures and Algorithms 22
enqueue
Data�Dequeue(Queue�*�pq){
Node�*�delNode;Data�retData;
if(QIsEmpty(pq)){
printf("Queue�Memory�Error!");exit(-1);
}
delNode =�pq->front;retData =�delNode->data;// F가 다음 노드를 가리킴pq->front�=�pq->front->next;
free(delNode);�//�노드 삭제return retData;
}
큐의활용
Data Structures and Algorithms 23
주제• 점심시간 1시간동안에고객이 15초당 1명씩주문• 종류별햄버거를만드는데걸리는시간• 치즈버거-12초• 불고기버거-15초• 더블버거-24초
• 시뮬레이션: 대기의길이를결정하는데필요한정보확보
• 시뮬레이션을통해서추출된정보의형태!• 수용인원이 30명인공간 안정적으로고객을수용할확률 50%• 수용인원이 50명인공간 안정적으로고객을수용할확률 70%• 수용인원이 100명인공간 안정적으로고객을수용할확률 90%• 수용인원이 200명인공간 안정적으로고객을수용할확률 100%
Data Structures and Algorithms 24
시뮬레이션예제• 점심시간은 1시간이고그동안고객은 15초에 1명씩주문
• 한명의고객은하나의버거만을주문
• 주문하는메뉴에는가중치없음
• 모든고객은무작위로메뉴선택
• 햄버거를만드는사람은 1명이다. 그리고동시에둘이상의버거가만들지않음
• 주문한메뉴를받을다음고객은대기실에서나와서대기
Data Structures and Algorithms 25
실행결과1 실행결과2
덱(Deque)의 이해와구현
Data Structures and Algorithms 26
덱 (Deque, double ended queue)• 덱은양방향으로 enqueue와 dequeue가되는자료구조• 스택과큐의특성을모두갖음• 덱을스택과큐로활용
• 덱의 4가지연산• 앞으로넣기• 앞에서빼기• 뒤에서빼기• 뒤에서넣기
Data Structures and Algorithms 27
덱의 ADT
Data Structures and Algorithms 28
덱의구현: 헤더파일정의 Dequeu.h
Data Structures and Algorithms 29
typedef DLDeque Deque;
void DequeInit(Deque *�pdeq);int DQIsEmpty(Deque *�pdeq);
void DQAddFirst(Deque *�pdeq,�Data�data);void DQAddLast(Deque *�pdeq,�Data�data);
Data�DQRemoveFirst(Deque *�pdeq);Data�DQRemoveLast(Deque *�pdeq);
Data�DQGetFirst(Deque *�pdeq);Data�DQGetLast(Deque *�pdeq);
typedef int Data;
typedef struct _node{���//�양방향 리스트
Data�data;struct _node�*�next;struct _node�*�prev;
}�Node;
typedef struct _dlDeque{ // 앞 뒤 연산
Node�*�head;Node�*�tail;
}�DLDeque;
덱의구현: 함수의정의• 양방향연결리스트의구조
• 이전에구현한양방향연결리스트의구조
Data Structures and Algorithms 30