C 언어 큐 (Queue) 자료구조 구현하기

CBeginner
지금 연습하기

소개

이 프로젝트에서는 C 언어로 큐 (queue) 자료 구조를 구현하는 방법을 배우게 됩니다. 큐는 컴퓨터 과학에서 널리 사용되며, 예를 들어 컴퓨터에서 데이터를 전송하는 데 사용되는 메시지 큐 (message queue) 에 활용됩니다.

👀 미리보기

$ gcc queue.c -o queue
$ ./queue
11250

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다:

  • 큐의 첫 번째 요소 값을 반환하는 front() 메서드를 구현하는 방법
  • 큐에서 첫 번째 요소를 제거하고 반환하는 pop() 메서드를 구현하는 방법
  • 현재 큐에 있는 요소의 수를 반환하는 count() 메서드를 구현하는 방법
  • 큐가 비어 있는지 확인하는 is_empty() 메서드를 구현하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • 큐 자료 구조의 기본 연산을 이해할 수 있습니다.
  • C 언어로 큐의 핵심 메서드를 구현할 수 있습니다.
  • 큐에 대한 지식을 실제 문제 해결에 적용할 수 있습니다.

front() 메서드 구현

이 단계에서는 큐의 front() 메서드를 구현하는 방법을 배우게 됩니다.

front() 메서드는 큐의 첫 번째 요소 값을 반환해야 합니다. 큐가 비어 있는 경우, 이 메서드는 exit(-1)로 프로그램을 종료해야 합니다.

이 단계를 완료하려면 다음 단계를 따르세요:

  1. /home/labex/project/queue.c에 위치한 queue.c 파일을 엽니다.
  2. 코드에서 front() 메서드를 찾습니다.
  3. 다음과 같이 front() 메서드를 구현합니다:
static int front() {
    if(!phead) {
        exit(-1);
    }
    return phead->val;
}

front() 메서드는 먼저 phead 포인터가 NULL인지 확인하여 큐가 비어 있는지 확인합니다. 큐가 비어 있으면, 이 메서드는 exit(-1)로 프로그램을 종료합니다.

큐가 비어 있지 않은 경우, 이 메서드는 큐의 첫 번째 요소를 나타내는 phead 노드에 저장된 값을 반환합니다.

✨ 솔루션 확인 및 연습

pop() 메서드 구현

이 단계에서는 큐의 pop() 메서드를 구현하는 방법을 배우게 됩니다.

pop() 메서드는 큐에서 첫 번째 요소를 제거하고 반환해야 합니다. 큐가 비어 있는 경우, 이 메서드는 exit(-1)로 프로그램을 종료해야 합니다.

이 단계를 완료하려면 다음 단계를 따르세요:

  1. /home/labex/project/queue.c에 위치한 queue.c 파일을 엽니다.
  2. 코드에서 pop() 메서드를 찾습니다.
  3. 다음과 같이 pop() 메서드를 구현합니다:
static int pop() {
    if(!phead) {
        exit(-1);
    }
    int val = phead->val;
    phead = phead->next;
    return val;
}

pop() 메서드는 먼저 phead 포인터가 NULL인지 확인하여 큐가 비어 있는지 확인합니다. 큐가 비어 있으면, 이 메서드는 exit(-1)로 프로그램을 종료합니다.

큐가 비어 있지 않은 경우, 이 메서드는 큐의 첫 번째 요소를 나타내는 phead 노드의 값을 저장합니다. 그런 다음, phead 포인터를 다음 노드로 업데이트하여 큐에서 첫 번째 요소를 효과적으로 제거합니다. 마지막으로, 이 메서드는 저장된 값을 반환합니다.

✨ 솔루션 확인 및 연습

count() 메서드 구현

이 단계에서는 큐의 count() 메서드를 구현하는 방법을 배우게 됩니다.

count() 메서드는 현재 큐에 있는 요소의 수를 반환해야 합니다.

이 단계를 완료하려면 다음 단계를 따르세요:

  1. /home/labex/project/queue.c에 위치한 queue.c 파일을 엽니다.
  2. 코드에서 count() 메서드를 찾습니다.
  3. 다음과 같이 count() 메서드를 구현합니다:
static int count() {
    int cnt = 0;
    for(struct node* p = phead; p; p=p->next) {
        cnt++;
    }
    return cnt;
}

count() 메서드는 cnt 변수를 0 으로 초기화합니다. 그런 다음, phead 노드와 그 후속 노드의 next 포인터를 따라 큐를 순회합니다. 각 노드를 만날 때마다 cnt 변수를 증가시킵니다. 마지막으로, 이 메서드는 큐에 있는 요소의 수를 나타내는 cnt 값을 반환합니다.

✨ 솔루션 확인 및 연습

is_empty() 메서드 구현

이 단계에서는 큐의 is_empty() 메서드를 구현하는 방법을 배우게 됩니다.

is_empty() 메서드는 큐가 비어 있으면 1 을 반환하고, 그렇지 않으면 0 을 반환해야 합니다.

이 단계를 완료하려면 다음 단계를 따르세요:

  1. /home/labex/project/queue.c에 위치한 queue.c 파일을 엽니다.
  2. 코드에서 is_empty() 메서드를 찾습니다.
  3. 다음과 같이 is_empty() 메서드를 구현합니다:
static int is_empty() {
    return phead == NULL;
}

is_empty() 메서드는 단순히 phead 포인터가 NULL인지 확인하여 큐가 비어 있는지 확인합니다. pheadNULL이면, 이 메서드는 1 을 반환하여 큐가 비어 있음을 나타냅니다. 그렇지 않으면 0 을 반환하여 큐가 비어 있지 않음을 나타냅니다.

축하합니다! 이제 큐 데이터 구조에 필요한 모든 메서드를 구현했습니다. 이제 프로그램을 컴파일하고 실행하여 큐의 기능을 테스트할 수 있습니다.

  1. 컴파일 및 실행:
$ gcc queue.c -o queue
$ ./queue
00000

예상 출력은 다음과 같습니다:

$ gcc queue.c -o queue
$ ./queue
11250
✨ 솔루션 확인 및 연습

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.