[알고리즘]은행관리 대기번호(C)

지환·2022년 1월 23일
0

알고리즘

목록 보기
1/12
post-thumbnail

은행에서 대기번호를 관리하는 프로그램을 만들어보자.
앞에서 한 명씩 빠져 나가는 구조를 갖는 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;



}

<결과>

  • 0을 누르면 앞에 저장되어 있던 값이 도출된다.
  • 음수나 조건에 해당되지 않으면 빠져나온다.

<중요코드1>

int enqueue(int n)

{

    if (queue_size == QUEUE_CAPA) 
    {

        printf("queue Full!!! \n");

        return;

    }

    tail++;

    queue_size++;

    queue[tail] = n;



}
  • 콘솔창에서 사용자가 배열의 크기보다 많이 입력 할 때, 함수 사용
  • enqueue는 배열 ㅁㅁㅁㅁㅁ <- 마지막 tail 부분을 늘리고 이에 따라 queue_size도 늘린다.
  • queue[tail]값에 사용자가 입력한 값을 넣는다.

<중요코드2>

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;

각 부분의 코드를 이와 같이 수정하면 된다.

profile
아는만큼보인다.

0개의 댓글