queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-dsa/slides/03_queue.pdf · 2018. 3. 8. · 주제...

30
Queue Data Structures and Algorithms

Upload: others

Post on 01-Sep-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

QueueData Structures and Algorithms

Page 2: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

목차• 큐의이해와 ADT 정의

• 큐의배열기반구현

• 큐의연결리스트기반구현

• 큐의활용

• 덱(Deque)의 이해와구현

Data Structures and Algorithms 2

Page 3: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

큐의이해와 ADT 정의

Data Structures and Algorithms 3

Page 4: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

큐(Stack)의이해와 ADT 정의• 큐는 ‘LIFO(Last-in, First-out) 구조’의자료구조• 먼저들어간것이먼저나오는구조

• 큐의기본연산• Enqueue: 큐에데이터를넣는연산• Dequeu: 큐에서데이터를꺼내는연산

Data Structures and Algorithms 4

Page 5: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

큐의 ADT 정의• 배열 또는 연결리스트 기반 큐

Data Structures and Algorithms 5

enqueue 연산

dequeue 연산

peek 연산

Page 6: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

큐의배열기반구현

Data Structures and Algorithms 6

Page 7: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

큐의 동작

Data Structures and Algorithms 7

enqueue 연산 dequeue 연산

• 큐의 꼬리(R)을 한칸 이동 후새 데이터 저장

• 큐의 머리(F)가 가리키는 데이터반환 후 F를 한 칸 이동

Page 8: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

배열 기반 큐의 문제점• Dequeue 동작으로배열이비더라도인덱스이상증가불가• 데이터추가를위해 R을인덱스 0위치로이동해야함

Data Structures and Algorithms 8

Page 9: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

원형큐• 배열의머리와끝을연결한구조

Data Structures and Algorithms 9

Page 10: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

원형 큐의 단순한 연산• R이 이동한 다음에 데이터 저장

• F가 가리키는 데이터 반환 후 F 이동

Data Structures and Algorithms 10

Page 11: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

원형큐의단순한연산의문제점

Data Structures and Algorithms 11

full

empty

Page 12: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

원형큐의문제점해결• 초기화: F와 R이같은위치를가리킴

• R이 F를가리키려고하면 Full

Data Structures and Algorithms 12

Page 13: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

원형큐의구현: 헤더파일

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

Page 14: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

원형큐의구현: 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;

}

Page 15: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당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;

}

Page 16: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

원형큐의구현: 함수정의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];

}

Page 17: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

큐의연결리스트기반구현

Data Structures and Algorithms 17

Page 18: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

연결리스트기반큐의헤더파일• 연결리스트기반스택의응용

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);

Page 19: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

연결리스트기반큐의구현: 초기화

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;

}

Page 20: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

연결리스트기반큐의구현: 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만 변경

Page 21: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

연결리스트기반큐의구현: dequeue• F가다음노드를가리킴, 이전노드삭제

• F가다음노드를가리킴, 이전노드삭제

Data Structures and Algorithms 21

R은 no-operation

Page 22: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

연결리스트기반큐의구현: 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;

}

Page 23: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

큐의활용

Data Structures and Algorithms 23

Page 24: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

주제• 점심시간 1시간동안에고객이 15초당 1명씩주문• 종류별햄버거를만드는데걸리는시간• 치즈버거-12초• 불고기버거-15초• 더블버거-24초

• 시뮬레이션: 대기의길이를결정하는데필요한정보확보

• 시뮬레이션을통해서추출된정보의형태!• 수용인원이 30명인공간 안정적으로고객을수용할확률 50%• 수용인원이 50명인공간 안정적으로고객을수용할확률 70%• 수용인원이 100명인공간 안정적으로고객을수용할확률 90%• 수용인원이 200명인공간 안정적으로고객을수용할확률 100%

Data Structures and Algorithms 24

Page 25: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

시뮬레이션예제• 점심시간은 1시간이고그동안고객은 15초에 1명씩주문

• 한명의고객은하나의버거만을주문

• 주문하는메뉴에는가중치없음

• 모든고객은무작위로메뉴선택

• 햄버거를만드는사람은 1명이다. 그리고동시에둘이상의버거가만들지않음

• 주문한메뉴를받을다음고객은대기실에서나와서대기

Data Structures and Algorithms 25

실행결과1 실행결과2

Page 26: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

덱(Deque)의 이해와구현

Data Structures and Algorithms 26

Page 27: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

덱 (Deque, double ended queue)• 덱은양방향으로 enqueue와 dequeue가되는자료구조• 스택과큐의특성을모두갖음• 덱을스택과큐로활용

• 덱의 4가지연산• 앞으로넣기• 앞에서빼기• 뒤에서빼기• 뒤에서넣기

Data Structures and Algorithms 27

Page 28: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

덱의 ADT

Data Structures and Algorithms 28

Page 29: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

덱의구현: 헤더파일정의 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;

Page 30: Queue - gnu.ac.kropen.gnu.ac.kr/lecslides/2018-1-DSA/slides/03_queue.pdf · 2018. 3. 8. · 주제 •점심시간1시간동안에고객이15초당1명씩주문 •종류별햄버거를만드는데걸리는시간

덱의구현: 함수의정의• 양방향연결리스트의구조

• 이전에구현한양방향연결리스트의구조

Data Structures and Algorithms 30