07장 큐(Queue) – 햄버거 시뮬레이션
- 원형 큐(Circular Queue)를 활용한 햄버거 시뮬레이션 구현 #1 :S007_HamburgerArrayCirQueue.c
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#include <stdio.h>#include <stdlib.h>#define QUE_LEN 30int QUEUE[QUE_LEN];int front = 0;int rear = 0;////// queue의 기본함수 enqueue(), dequeue(), +알파함수 peek()void enqueue(int data){if( (rear + 1) % QUE_LEN == front){printf("Overflow\n");}else{rear = (rear + 1) % QUE_LEN;QUEUE[rear] = data;}}int dequeue(){if(front == rear){printf("Empty\n");return -1;}else{front = (front + 1) % QUE_LEN;return QUEUE[front];}}int peek(){if(front == rear){printf("Empty\n");return -1;}else{return QUEUE[(front + 1) % QUE_LEN];}}////////// queue 추가 함수void initQueue(){front = 0;rear = 0;}int isEmpty(){if(front == rear){return 1; //true}else{return 0; //false}}int isFull(){if( (rear + 1) % QUE_LEN == front){return 1; //true}else{return 0; //false}}void printQueue(){int i=0;printf("front(%2d), rear(%2d) : ", front, rear);int cnt = (rear - front + QUE_LEN) % QUE_LEN;for(i=0; i<cnt; i++){printf("%d ", QUEUE[(front + i + 1) % QUE_LEN]);}printf("\n");} - 원형 큐(Circular Queue)를 활용한 햄버거 시뮬레이션 구현 #2
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#define CUS_COME_TERM 15 // 고객의 주문 간격: 초 단위#define CHE_BUR 0 // 치즈버거 상수#define BUL_BUR 1 // 불고기버거 상수#define DUB_BUR 2 // 더블버거 상수#define CHE_TERM 12 // 치즈버거 제작 시간: 초 단위#define BUL_TERM 15 // 불고기버거 제작 시간: 초 단위#define DUB_TERM 24 // 더블버거 제작 시간: 초 단위///////// 메인 함수void main(){int makeProc=0; // 햄버거 제작 진행상황int cheOrder=0, bulOrder=0, dubOrder=0;int sec;initQueue();srand(time(NULL));// 아래 for문의 1회 회전은 1초의 시간 흐름을 의미함for(sec=0; sec<3600; sec++){if(sec % CUS_COME_TERM == 0){switch(rand() % 3){case CHE_BUR:enqueue(CHE_TERM);cheOrder += 1;break;case BUL_BUR:enqueue(BUL_TERM);bulOrder += 1;break;case DUB_BUR:enqueue(DUB_TERM);dubOrder += 1;break;}}if(makeProc<=0 && !isEmpty()){makeProc = dequeue();//int cnt = (rear - front + QUE_LEN) % QUE_LEN;//printf("Queue Data Size : %d\n", cnt);}makeProc--;}printf("Simulation Report! \n");printf(" - Cheese burger: %d \n", cheOrder);printf(" - Bulgogi burger: %d \n", bulOrder);printf(" - Double burger: %d \n", dubOrder);printf(" - Waiting room size: %d \n", QUE_LEN);} - 원형 큐(Circular Queue)를 활용한 햄버거 시뮬레이션 완성 버전
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135#include <stdio.h>#include <stdlib.h>#define QUE_LEN 30int QUEUE[QUE_LEN];int front = 0;int rear = 0;////// queue의 기본함수 enqueue(), dequeue(), +알파함수 peek()void enqueue(int data){if( (rear + 1) % QUE_LEN == front){printf("Overflow\n");}else{rear = (rear + 1) % QUE_LEN;QUEUE[rear] = data;}}int dequeue(){if(front == rear){printf("Empty\n");return -1;}else{front = (front + 1) % QUE_LEN;return QUEUE[front];}}int peek(){if(front == rear){printf("Empty\n");return -1;}else{return QUEUE[(front + 1) % QUE_LEN];}}////////// queue 추가 함수void initQueue(){front = 0;rear = 0;}int isEmpty(){if(front == rear){return 1; //true}else{return 0; //false}}int isFull(){if( (rear + 1) % QUE_LEN == front){return 1; //true}else{return 0; //false}}void printQueue(){int i=0;printf("front(%2d), rear(%2d) : ", front, rear);int cnt = (rear - front + QUE_LEN) % QUE_LEN;for(i=0; i<cnt; i++){printf("%d ", QUEUE[(front + i + 1) % QUE_LEN]);}printf("\n");}#define CUS_COME_TERM 15 // 고객의 주문 간격: 초 단위#define CHE_BUR 0 // 치즈버거 상수#define BUL_BUR 1 // 불고기버거 상수#define DUB_BUR 2 // 더블버거 상수#define CHE_TERM 12 // 치즈버거 제작 시간: 초 단위#define BUL_TERM 15 // 불고기버거 제작 시간: 초 단위#define DUB_TERM 24 // 더블버거 제작 시간: 초 단위///////// 메인 함수void main(){int makeProc=0; // 햄버거 제작 진행상황int cheOrder=0, bulOrder=0, dubOrder=0;int sec;initQueue();srand(time(NULL));// 아래 for문의 1회 회전은 1초의 시간 흐름을 의미함for(sec=0; sec<3600; sec++){if(sec % CUS_COME_TERM == 0){switch(rand() % 3){case CHE_BUR:enqueue(CHE_TERM);cheOrder += 1;break;case BUL_BUR:enqueue(BUL_TERM);bulOrder += 1;break;case DUB_BUR:enqueue(DUB_TERM);dubOrder += 1;break;}}if(makeProc<=0 && !isEmpty()){makeProc = dequeue();//int cnt = (rear - front + QUE_LEN) % QUE_LEN;//printf("Queue Data Size : %d\n", cnt);}makeProc--;}printf("Simulation Report! \n");printf(" - Cheese burger: %d \n", cheOrder);printf(" - Bulgogi burger: %d \n", bulOrder);printf(" - Double burger: %d \n", dubOrder);printf(" - Waiting room size: %d \n", QUE_LEN);}