Hyokyun Yim bio photo

Hyokyun Yim

Koreatech Computer Science Engineering undergraduate 4 grade.

Facebook Github

원형 큐 자료구조를 사용해서 시뮬레이션을 만들어 보았습니다.

Overview

원형 큐 코드



// CircularQueue.h

#ifndef __C_QUEUE_H__
#define __C_QUEUE_H__

#define TRUE	1
#define FALSE	0

#define	QUE_LEN	50
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);

#endif

//CircularQueue.c

#include <stdio.h>
#include <stdlib.h>
#include "CirularQueue.h"

void QueueInit(Queue* pq)
{
	pq->front = 0;
	pq->rear = 0;
}

int QIsEmpty(Queue* pq)
{
	// Front 와 Rear이 같은 위치를 가리킬경우 텅빔
	if (pq->front == pq->rear)     
		return TRUE;
	else
		return FALSE;
}

int NextPosIndex(int pos)
{
	if (pos == QUE_LEN - 1)
		return 0;
	else
		return pos+1;

}

void Enqueue(Queue* pq, Data data)
{
	// rear의 다음 위치가 == Front 
	if (NextPosIndex(pq->rear) == pq->front)     
	{
		printf("Queue is Full \n");
	}

	// Rear를 한칸 이동시키고
	// Rear가 가리키는 위치에 데이터 저장
	pq->rear = NextPosIndex(pq->rear);    
	pq->queArr[pq->rear] = data;          

}

Data Dequeue(Queue* pq)
{
	// 큐가 비어있다면
	if (QIsEmpty(pq))                   
	{
		printf("DeQueue Memory Error");
		exit(-1);
	}

	// 맨처음 Front는 빈 공간을 가리키고 있으므로.. 
	// 다음 데이터를 가리킨다음 제거
	pq->front = NextPosIndex(pq->front);	 
	return pq->queArr[pq->front];		 

}

Data QPeek(Queue* pq)
{
	// 큐가 비어있다면
	if (QIsEmpty(pq))                   
	{
		printf("Qpeek Memory Error");
		exit(-1);
	}

	// front 위치의 데이터를 가져옴
	return pq->queArr[NextPosIndex(pq->front)];		 

}

메인 시뮬레이션 코드


#include <stdio.h>
#include "CirularQueue.h"
#include <time.h>

//15초마다 제작 주문이 들어옴
#define ORDER_TERM	15				

#define TV	0
#define PHONE	1
#define CAR	2

#define MK_TV_TIME	15
#define MK_PHONE_TIME	10
#define MK_CAR_TIME	20

int main(void)
{
	int TvCount=0, CarCount=0, PhoneCount=0;
	int finishtime = 0;
	int success = 0;
	Queue q;
	QueueInit(&q);

	srand(time(NULL));

	// time 변수 1을 1초로 취급
	for (int time = 0; time < 3000; time++)	
	{
		
		if (time % ORDER_TERM == 0 )
		{
			switch (rand() % 3)
			{
			case TV :
				Enqueue(&q, MK_TV_TIME);
				TvCount++;
				break;
			case PHONE :
				Enqueue(&q, MK_PHONE_TIME);
				PhoneCount++;
				break;
			case CAR :
				Enqueue(&q, MK_CAR_TIME);
				CarCount++;
				break;
			}
		}

		
		// 진행하던 작업이 끝나면 
		if (!QIsEmpty(&q) &&  finishtime <= 0)   
		// 다음 주문을 큐에서 빼내어 작업을 진행함									     
		{
			finishtime = Dequeue(&q);
			
		}

		finishtime--;
		if (finishtime == 0) success++;
	}

	printf("Simulation Result \n");
	printf("TV Order : %d \n", TvCount);
	printf("Phone Order : %d \n", PhoneCount);
	printf("Car Order : %d \n", CarCount);
	printf("success : %d  \n", success);
	printf("probability of success : %.1f%%", 
                ((double)success / (TvCount + PhoneCount + CarCount)) 
					* 100);

	


}

  • 일정한 간격으로 요청되는 3가지 주문을 순차적으로 받아 큐에 넣으면서 대기 하도록 합니다.
  • 맨 앞 주문이 끝나면 큐에서 빼내어 제작을 시작합니다.
  • 결과를 최종적으로 출력