μ•„μ˜³μ΄ 2021. 9. 1. 17:53

큐(Queue) : FIFO(First-In-First-Out)  = μ„ μž…μ„ μΆœ

 

-λ¦¬μŠ€νŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ„ ν˜• 자료ꡬ쑰 But 자료의 μΆ”κ°€λŠ” 맨 λ’€(Rear)μ—μ„œ, μ œκ±°λŠ” 맨 μ•ž(Front)μ—μ„œ

 

큐의 μ—°μ‚°

인큐(enqueue): 큐의 맨 뒀에 μƒˆλ‘œμš΄ 자료λ₯Ό μΆ”κ°€

디큐(dequeue): 큐의 맨 μ•žμ—μ„œ μžˆλŠ” 자료λ₯Ό μ œκ±°ν•œ λ’€ λ°˜ν™˜

피크(peek): 큐의 맨 μ•žμ— μžˆλŠ” 자료λ₯Ό μ œκ±°ν•˜μ§€ μ•Šκ³  λ°˜ν™˜

 

배열을 μ΄μš©ν•œ μ„ ν˜• 큐

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

typedef struct ArrayQueueNodeType		// λ…Έλ“œ κ΅¬ν˜„, λ…Έλ“œλ‘œ 자료λ₯Ό κ°μ‹ΈλŠ” μ΄μœ λŠ” λ™μ‹œμ— μ—¬λŸ¬κ°œμ˜ 자료λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•΄
{
	char			data;
} ArrayQueueNode;

typedef struct ArrayQueueType
{
	int				maxCount;			// μ΅œλŒ€ 자료 개수
	int				currentCount;		// ν˜„μž¬ 재료 개수
	int				front;				// ν”„λŸ°νŠΈ μœ„μΉ˜
	int				rear;				// 리어 μœ„μΉ˜
	ArrayQueueNode	*pData;				// 자료λ₯Ό μ €μž₯ν•˜λŠ” 1차원 λ°°μ—΄ 포인터
} ArrayQueue;

ArrayQueue	*createArrayQueue(int size)
{
	ArrayQueue	*pReturn = NULL;
	pReturn = (ArrayQueue *)malloc(sizeof(ArrayQueue));
	memset(pReturn, 0, sizeof(ArrayQueue));
	pReturn->maxCount = size;
	pReturn->front = -1;				// 빈 큐에 처음으둜 자료룰 μΆ”κ°€ν•˜λ©΄ λ…Έλ“œμ˜ μΈλ±μŠ€κ°€ 0이 λ˜μ•Όν•˜κΈ° λ–„λ¬Έ
	pReturn->rear = -1;

	pReturn->pData = (ArrayQueueNode *)malloc(sizeof(ArrayQueueNode) * size);
	memset(pReturn->pData, 0, sizeof(ArrayQueueNode) * size);

	return (pReturn);
}

int		isArrayQueueFull(ArrayQueue *pQueue)
{
	int	ret = 0;

	if (pQueue != NULL)
	{
		if (pQueue->currentCount == pQueue->maxCount		// ν˜„μž¬ μ €μž₯된 μžλ£Œκ°œμˆ˜κ°€ μ΅œλŒ€ μžλ£Œκ°œμˆ˜μ™€ κ°™μœΌλ©΄
			|| pQueue->rear == pQueue->maxCount - 1)		// λ¦¬μ–΄μΈλ±μŠ€κ°€ λ§ˆμ§€λ§‰ μΈλ±μŠ€μ•  λ„λ‹¬ν•˜λ©΄
			ret = 1;
	}

	return (ret);
}

int		enqueueAQ(ArrayQueue *pQueue, char data)
{
	int	ret = 0;

	if (pQueue != NULL)
	{
		if (isArrayQueueFull(pQueue) == 0)
		{
			pQueue->rear++;
			pQueue->pData[pQueue->rear].data = data;
			pQueue->currentCount++;
			ret = 1;
		}
		else
			printf("였λ₯˜, 큐가 가득 μ°ΌμŠ΅λ‹ˆλ‹€, enqueueAQ()\n");
	}

	return (ret);
}

int		isArrayQueueEmpty(ArrayQueue *pQueue)
{
	int	ret = 0;

	if (pQueue != NULL)
	{
		if (pQueue->currentCount == 0)
			ret = 1;
	}

	return (ret);
}

ArrayQueueNode	*dequeueAQ(ArrayQueue *pQueue)
{
	ArrayQueueNode	*pReturn = NULL;
	if (pQueue != NULL)
	{
		if (isArrayQueueEmpty(pQueue) == 0)
		{
			pReturn = (ArrayQueueNode *)malloc(sizeof(ArrayQueueNode));
			if (pReturn != NULL)
			{
				pQueue->front++;
				pReturn->data = pQueue->pData[pQueue->front].data;
				pQueue->currentCount--;
			}
			else
				printf("였λ₯˜, λ©”λͺ¨λ¦¬ ν• λ‹Ή, dequeueAQ()\n");
		}
	}

	return (pReturn);		// λ™μ ν• λ‹Ήν•œ μ£Όμ†Œλ₯Ό λ°˜ν™˜, λ©”λͺ¨λ¦¬ ν•΄μ œλŠ” ν˜ΈμΆœν•œ κ³³μ—μ„œ
}

ArrayQueueNode	*peekAQ(ArrayQueue *pQueue)
{
	ArrayQueueNode	*pReturn = NULL;
	if (pQueue != NULL)
	{
		if (isArrayQueueEmpty(pQueue) == 0)
			pReturn = &(pQueue->pData[pQueue->front + 1]);
	}

	return (pReturn);
}

void	deleteArrayQueue(ArrayQueue *pQueue)
{
	if (pQueue != NULL)
	{
		if (pQueue->pData != NULL)
			free(pQueue->pData);
		free(pQueue);
	}
}

void	displayArrayQueue(ArrayQueue *pQueue)
{
	int	i = 0;

	if (pQueue != NULL)
	{
		printf("큐의 크기: %d, ν˜„μž¬ λ…Έλ“œ 개수: %d\n",
			pQueue->maxCount,
			pQueue->currentCount);

		for (i = pQueue->front + 1; i <= pQueue->rear; i++)
			printf("[%d]-[%c]\n", i, pQueue->pData[i].data);
	}
}

int	main(void)
{
	ArrayQueue *pQueue = NULL;
	ArrayQueueNode	*pNode = NULL;

	pQueue = createArrayQueue(4);
	if (pQueue != NULL)
	{
		enqueueAQ(pQueue, 'A');
		enqueueAQ(pQueue, 'B');
		enqueueAQ(pQueue, 'C');
		enqueueAQ(pQueue, 'C');
		displayArrayQueue(pQueue);

		pNode = dequeueAQ(pQueue);
		if (pNode != NULL)
		{
			printf("Dequeue Value-[%c]\n",
				pNode->data);
			free(pNode);
		}
		displayArrayQueue(pQueue);

		pNode = peekAQ(pQueue);
		if (pNode != NULL)
			printf("Peek Value-[%c]\n",
				pNode->data);
		displayArrayQueue(pQueue);

		enqueueAQ(pQueue, 'E');			// Error
		displayArrayQueue(pQueue);
	}
	deleteArrayQueue(pQueue);

	return (0);
}

λ°°μ—΄μ„ ν˜•νλŠ” dequeue둜 맨 μ•žμ— 빈 λ…Έλ“œκ°€ μžˆμ–΄λ„ rear 의 값이 λ³€ν•˜μ§€ μ•Šμ•„ μ—¬μœ κ³΅κ°„μ΄ μžˆμ–΄λ„ μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 단점이 μžˆλ‹€.

μ΄λŸ¬ν•œ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 것이 'λ°°μ—΄ μ›ν˜• 큐' 이닀.

 

λ°°μ—΄ μ›ν˜• 큐 (μ„ ν˜• 큐와 λ‹€λ₯Έ λΆ€λΆ„λ§Œ)

int		isArrayQueueFull(ArrayQueue *pQueue)
{
	int	ret = 0;

	if (pQueue != NULL)
	{
		//if (pQueue->currentCount == pQueue->maxCount		// ν˜„μž¬ μ €μž₯된 μžλ£Œκ°œμˆ˜κ°€ μ΅œλŒ€ μžλ£Œκ°œμˆ˜μ™€ κ°™μœΌλ©΄
		//	|| pQueue->rear == pQueue->maxCount - 1)		// λ¦¬μ–΄μΈλ±μŠ€κ°€ λ§ˆμ§€λ§‰ μΈλ±μŠ€μ•  λ„λ‹¬ν•˜λ©΄
		if (pQueue->currentCount == pQueue->maxCount)
			ret = 1;
	}

	return (ret);
}

int		enqueueAQ(ArrayQueue *pQueue, char data)
{
	int	ret = 0;

	if (pQueue != NULL)
	{
		if (isArrayQueueFull(pQueue) == 0)
		{
			//pQueue->rear++;
			pQueue->rear = (pQueue->rear + 1) % pQueue->maxCount;		// λ‚˜λ¨Έμ§€ 연산을 μ΄μš©ν•΄ λ°°μ—΄μ˜ λ§ˆμ§€λ§‰μ„ 처음과 λ…Όλ¦¬μ μœΌλ‘œ μ—°κ²°
			pQueue->pData[pQueue->rear].data = data;
			pQueue->currentCount++;
			ret = 1;
		}
		else
			printf("였λ₯˜, 큐가 가득 μ°ΌμŠ΅λ‹ˆλ‹€, enqueueAQ()\n");
	}

	return (ret);
}

ArrayQueueNode	*dequeueAQ(ArrayQueue *pQueue)
{
	ArrayQueueNode	*pReturn = NULL;
	if (pQueue != NULL)
	{
		if (isArrayQueueEmpty(pQueue) == 0)
		{
			pReturn = (ArrayQueueNode *)malloc(sizeof(ArrayQueueNode));
			if (pReturn != NULL)
			{
				//pQueue->front++;
				pQueue->front = (pQueue->front + 1) % pQueue->maxCount;
				pReturn->data = pQueue->pData[pQueue->front].data;
				pQueue->currentCount--;
			}
			else
				printf("였λ₯˜, λ©”λͺ¨λ¦¬ ν• λ‹Ή, dequeueAQ()\n");
		}
	}

	return (pReturn);		// λ™μ ν• λ‹Ήν•œ μ£Όμ†Œλ₯Ό λ°˜ν™˜, λ©”λͺ¨λ¦¬ ν•΄μ œλŠ” ν˜ΈμΆœν•œ κ³³μ—μ„œ
}

void	displayArrayQueue(ArrayQueue *pQueue)
{
	int	i = 0;
	int position = 0;

	if (pQueue != NULL)
	{
		printf("큐의 크기: %d, ν˜„μž¬ λ…Έλ“œ 개수: %d\n",
			pQueue->maxCount,
			pQueue->currentCount);

		//for (i = pQueue->front + 1; i <= pQueue->rear; i++)
		for (i = pQueue->front + 1; i <= pQueue->front + pQueue->currentCount; i++)	// front μœ„μΉ˜λΆ€ν„° μ €μž₯된 자료 개수만큼
		{
			position = i % pQueue->maxCount;
			printf("[%d]-[%c]\n", position, pQueue->pData[i].data);
		}
	}
}

 

포인터λ₯Ό μ΄μš©ν•œ μ—°κ²° 큐(Linked Queue)

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

typedef struct LinkedQueueNodeType
{
	char	data;
	struct	LinkedQueueNodeType	*pLink;
} LinkedQueueNode;

typedef struct LinkedQueueType
{
	int	currentCount;
	LinkedQueueNode	*pFront;
	LinkedQueueNode	*pRear;
} LinkedQueue;

LinkedQueue	*createLinkedQueue()
{
	LinkedQueue	*pReturn = (LinkedQueue *)malloc(sizeof(LinkedQueue));
	memset(pReturn, 0, sizeof(LinkedQueue));

	return (pReturn);
}

int	isLinkedQueueEmpty(LinkedQueue *pQueue)
{
	int	ret = 0;

	if (pQueue != NULL)
	{
		if (pQueue->currentCount == 0)
			ret = 1;
	}

	return (ret);
}

int	enqueueLQ(LinkedQueue *pQueue, char data)
{
	int ret = 0;
	LinkedQueueNode *pNode = NULL;

	pNode = (LinkedQueueNode *)malloc(sizeof(LinkedQueueNode));
	pNode->data = data;
	pNode->pLink = NULL;

	if (isLinkedQueueEmpty(pQueue) == 0)
	{
		pQueue->pRear->pLink = pNode;
		pQueue->pRear = pNode;
	}
	else
	{
		pQueue->pFront = pNode;
		pQueue->pRear = pNode;
	}
	pQueue->currentCount++;
	ret = 1;

	return (ret);
}

LinkedQueueNode	*dequeueLQ(LinkedQueue *pQueue)
{
	LinkedQueueNode	*pReturn = NULL;
	if (isLinkedQueueEmpty(pQueue) == 0)
	{
		pReturn = pQueue->pFront;
		pQueue->pFront = pQueue->pFront->pLink;
		pReturn->pLink = NULL;

		pQueue->currentCount--;

		if (isLinkedQueueEmpty(pQueue) == 1)
			pQueue->pRear = NULL;
	}

	return (pReturn);
}

LinkedQueueNode	*peekLQ(LinkedQueue *pQueue)
{
	LinkedQueueNode	*pReturn = NULL;
	if (pQueue != NULL)
	{
		if (isLinkedQueueEmpty(pQueue) == 0)
			pReturn = pQueue->pFront;
	}

	return (pReturn);
}

void	deleteLinkedQueue(LinkedQueue *pQueue)
{
	LinkedQueueNode	*pNode = NULL;
	LinkedQueueNode	*pDelNode = NULL;

	if (pQueue != NULL)
	{
		pNode = pQueue->pFront;
		while (pNode != NULL)
		{
			pDelNode = pNode;
			pNode = pNode->pLink;
			free(pDelNode);
		}
		free(pQueue);
	}
}

void	displayLinkedQueue(LinkedQueue *pQueue)
{
	LinkedQueueNode	*pNode = NULL;
	int	i = 0;

	if (pQueue != NULL)
	{
		printf("ν˜„μž¬ λ…Έλ“œ 개수: %d\n",
			pQueue->currentCount);
		pNode = pQueue->pFront;
		while (pNode != NULL)
		{
			printf("[%d]-[%c]\n", i, pNode->data);
			i++;
			pNode = pNode->pLink;
		}
	}
}

int	main(void)
{
	LinkedQueue	*pQueeu = NULL;
	LinkedQueueNode	*pNode = NULL;

	pQueeu = createLinkedQueue();
	if (pQueeu != NULL)
	{
		enqueueLQ(pQueeu, 'A');
		enqueueLQ(pQueeu, 'B');
		enqueueLQ(pQueeu, 'C');
		enqueueLQ(pQueeu, 'D');
		displayLinkedQueue(pQueeu);

		pNode = dequeueLQ(pQueeu);
		if (pNode != NULL)
		{
			printf("Dequeue Value-[%c]\n", pNode->data);
			free(pNode);
		}
		displayLinkedQueue(pQueeu);

		pNode = peekLQ(pQueeu);
		if (pNode != NULL)
			printf("Peek Value-[%c]\n", pNode->data);
		displayLinkedQueue(pQueeu);

		enqueueLQ(pQueeu, 'E');
		displayLinkedQueue(pQueeu);
	}

	return (0);
}

dequeue() λ₯Ό μˆ˜ν–‰ν•΄λ„, ν”„λŸ°νŠΈλ…Έλ“œμ˜ 인덱슀 값이 0이닀