고급 개발자로 가는 길

Algorithm

Queue

다크엔지니어 2020. 3. 4. 11:24
반응형

Queue 를 구현해 보았다.

Queue 는 FIFO 구조로 가장 먼저들어온 요소가 가장 먼저 나가게 된다.

그렇다보니 주로 Buffer 에서 자주 사용된다. Buffer 는 먼저 들어온 요소를 먼저 처리해야 하기 때문이다.

펌웨어의 경우 Task ISR 에서 Queue 라는 buffer 를 생성하여, 여러 Interrupt 에 따른 Signal 이 발생하였을 때

여러 Signal 을 Queue Buffer 에 저장해 두어 처리해 나아간다.

그렇게 해당 Task 는 Signal 을 받아 wait_Sig 에서 탈출하여 해당 Task 의 루틴을 동작하게 된다.

 

일반적인 Queue 의 경우 단점은 rear 이 메모리 끝에 도착했을 때, 데이터가 넉넉히 비어있음에도 불구하고 더 이상 삽입 할 수 없는 상황이 벌어진다.

이럴경우는 원형큐를 구현하면 말그래도 원형으로 꼬리를 물고 있음으로 메모리가 비어있다면 언제든 삽입이 가능하다.

 

아래 코딩은 구조체를 사용한 단순 Queue 를 만들어보았다. 아주 단순하게..

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define QUEUE_SIZE 10

typedef struct
{
	char data[QUEUE_SIZE];
	int front, rear;
}QueueType;

QueueType *CreateQueue()
{
	QueueType *NewQueue = (QueueType *)malloc(sizeof(QueueType));
	NewQueue->front = 0;
	NewQueue->rear = 0;

	return NewQueue;
}

bool Empty(QueueType *Q)
{
	if (Q->front == Q->rear)
	{
		printf("Queue Buffer is Empty\n");
		return 1;
	}
	else return 0;
}

bool Full(QueueType *Q)
{
	if (Q->rear == QUEUE_SIZE - 1)
	{
		printf("Queue Buffer is Full\n");
		return 1;
	}
	else return 0;
}

void PrintQueue(QueueType *Q)
{
	if (Empty(Q)) return;

	int i = Q->front;
	while (i != Q->rear)
	{
		printf("%3c", Q->data[i++]);
	}	
	printf("\n");
}

void enQueue(QueueType *Q, char strData)
{
	if (Full(Q)) return;

	Q->data[Q->rear++] = strData;
}

void deQueue(QueueType *Q)
{
	if (Empty(Q)) return;

	Q->data[Q->front++];
}

int main(void)
{
	QueueType *Q = CreateQueue();

	PrintQueue(Q);

	enQueue(Q, 'A');
	enQueue(Q, 'B');
	enQueue(Q, 'C');
	PrintQueue(Q);

	enQueue(Q, 'D');
	enQueue(Q, 'E');
	enQueue(Q, 'F');
	PrintQueue(Q);

	deQueue(Q);
	deQueue(Q);
	deQueue(Q);
	PrintQueue(Q);
	
	enQueue(Q, 'G');
	enQueue(Q, 'H');
	enQueue(Q, 'I');
	PrintQueue(Q);

	free(Q);
	getchar();

	return 0;
}

Queue 의 구현 결과

반응형

'Algorithm' 카테고리의 다른 글

LinkedList Queue  (0) 2020.03.05
Circular Queue  (0) 2020.03.04
Merge Sort  (0) 2020.03.04
Quick Sort  (0) 2020.03.03
Bubble Sort  (0) 2020.03.03