은행에서 대기번호를 관리하는 프로그램을 만들어보자.
앞에서 한 명씩 빠져 나가는 구조를 갖는 queue를 이용 할 것이다.
#include <stdio.h>
#define QUEUE_CAPA 8
int queue[QUEUE_CAPA]; // 전체적인 배열을 선언한 것이다.
int head = 0; // 배열의 맨 앞 부분을 의미한다.
int tail = 0; // 꼬리 부분을 의미한다.
int queue_size = 0; // 값을 넣은 부분(인덱스)을 의미한다.
int enqueue(int n)
{
if (queue_size == QUEUE_CAPA)
{
printf("queue Full!!! \n");
return;
}
tail++;
queue_size++;
queue[tail] = n;
}
int dequeue()
{
int r;
if (queue_size == 0)
{
printf("queue empty!!\n");
return 0;
}
r = queue[head];
head++;
queue_size--;
return r;
}
int main()
{
int number, r;
do {
printf("input number\n");
scanf_s("%d", &number);
if (number > 0)
{
enqueue(number);
}
else if (number == 0)
{
r = dequeue();
printf("[%d]\n", r);
}
} while (number >= 0);
return 0;
}
int enqueue(int n)
{
if (queue_size == QUEUE_CAPA)
{
printf("queue Full!!! \n");
return;
}
tail++;
queue_size++;
queue[tail] = n;
}
int dequeue()
{
int r;
if (queue_size == 0)
{
printf("queue empty!!\n");
return 0;
}
r = queue[head];
head++;
queue_size--;
return r;
}
dequeue 를 선언한 이유는 우리가 앞 서 queue 함수를 볼 때. 가장 먼저 넣은 것이 1순위로 출력된다. 0를 입력했을 때, 배열 앞에 있는 가장 먼저 입력된 값을 출력한다.
r = queue[head]값은 == 도출 되는 값 / r값에 queue를 대입하고 순서 상 앞 쪽에 위치한다.
head++ 증가 시키는 이유는 앞에 있던 값이 도출 됐기 때문에 tail 방향으로 이동해야된다.
queue_size는 전체적인 배열의 크기가 작아지기 때문에 감소한다.
하지만 문제가 있다. 배열의 앞쪽에 빈자리가 있어도 사용하지 못한다. 필자는 이 문제를 해결하기 위해서 원형 큐를 이용했다.
tail = (tail + 1) % QUEUE_CAPA;
head = (head + 1) % QUEUE_CAPA;
각 부분의 코드를 이와 같이 수정하면 된다.