ν Queue
ν(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μ΄λ€