본문 바로가기
Programming

C++로 Queue를 사용하는 방법

by 느리게 걷는 즐거움 2024. 11. 13.
반응형

C++에서 `queue`는 FIFO(First In, First Out) 구조를 가진 자료구조로, 데이터가 삽입된 순서대로 처리해야 하는 상황에서 유용하게 사용할 수 있습니다. 이 글에서는 C++의 `queue` 사용 방법을 간단히 설명하고, 실전 예제를 통해 어떻게 활용할 수 있는지 알아보겠습니다.

 

1. `queue` 헤더와 기본 구조

C++의 `queue`는 `<queue>` 헤더에 정의되어 있습니다. 따라서 `queue`를 사용하려면 먼저 `<queue>` 헤더를 포함해야 합니다.

#include <queue>
#include <iostream>

`queue`는 일반적으로 `std::queue<자료형>` 형식으로 선언합니다. 예를 들어, `int`형 데이터를 저장하는 큐는 `std::queue<int>`로 선언할 수 있습니다.

 

2. 기본 함수와 활용법

`queue`는 아래와 같은 기본적인 멤버 함수들을 제공합니다.

push(): 큐의 끝에 요소를 추가합니다.
std::queue<int> q;
q.push(10); // 10을 큐의 끝에 추가
q.push(20); // 20을 큐의 끝에 추가
pop(): 큐의 앞에 있는 요소를 제거합니다.
q.pop(); // 큐의 가장 앞에 있는 요소 제거
front(): 큐의 가장 앞에 있는 요소를 반환합니다.
int firstElement = q.front(); // 큐의 가장 앞에 있는 요소 반환
back(): 큐의 가장 끝에 있는 요소를 반환합니다.
int lastElement = q.back(); // 큐의 가장 뒤에 있는 요소 반환
empty(): 큐가 비어 있는지 확인합니다.
if (q.empty()) {
    std::cout << "큐가 비어 있습니다." << std::endl;
}
size(): 큐에 있는 요소의 개수를 반환합니다.
std::cout << "큐의 크기: " << q.size() << std::endl;

 

3. 예제: 고객 대기열 관리 시스템

고객 대기열 관리 시스템을 구현한다고 가정해보겠습니다. 이 시스템에서는 고객들이 줄을 서고, 대기열에 맞춰 순차적으로 서비스됩니다. `queue`를 사용해 대기열을 관리할 수 있습니다.

#include <iostream>
#include <queue>
#include <string>

int main() {
    std::queue<std::string> customerQueue;

    // 고객이 줄을 섬
    customerQueue.push("Alice");
    customerQueue.push("Bob");
    customerQueue.push("Charlie");

    std::cout << "현재 대기 중인 고객 수: " << customerQueue.size() << std::endl;

    // 대기열에서 고객 서비스
    while (!customerQueue.empty()) {
        std::cout << "현재 서비스 중인 고객: " << customerQueue.front() << std::endl;
        customerQueue.pop(); // 현재 고객을 대기열에서 제거
    }

    std::cout << "모든 고객이 서비스를 받았습니다." << std::endl;

    return 0;
}
출력 결과
현재 대기 중인 고객 수: 3
현재 서비스 중인 고객: Alice
현재 서비스 중인 고객: Bob
현재 서비스 중인 고객: Charlie
모든 고객이 서비스를 받았습니다.

위 코드에서는 `customerQueue`라는 `queue` 객체를 생성하고, `push()` 함수를 이용해 고객을 순서대로 대기열에 추가했습니다. 이후 `front()`와 `pop()`을 사용해 대기열 맨 앞의 고객을 순차적으로 서비스하고 대기열에서 제거했습니다.

 

예제 2: 프린터 작업 대기열

프린터는 작업 요청을 순서대로 처리해야 하므로, 작업 대기열을 관리하는 데 `queue`가 적합합니다.

#include <iostream>
#include <queue>

struct PrintJob {
    int jobId;
    int pages;
};

int main() {
    std::queue<PrintJob> printQueue;

    // 작업 추가
    printQueue.push({1, 10});
    printQueue.push({2, 5});
    printQueue.push({3, 15});

    std::cout << "프린터 작업 대기열에 " << printQueue.size() << "개의 작업이 있습니다." << std::endl;

    // 작업 처리
    while (!printQueue.empty()) {
        PrintJob currentJob = printQueue.front();
        std::cout << "작업 ID: " << currentJob.jobId << ", 페이지 수: " << currentJob.pages << " 인쇄 중..." << std::endl;
        printQueue.pop();
    }

    std::cout << "모든 작업이 완료되었습니다." << std::endl;

    return 0;
}
출력 결과
프린터 작업 대기열에 3개의 작업이 있습니다.
작업 ID: 1, 페이지 수: 10 인쇄 중...
작업 ID: 2, 페이지 수: 5 인쇄 중...
작업 ID: 3, 페이지 수: 15 인쇄 중...
모든 작업이 완료되었습니다.

이 예제에서는 `PrintJob` 구조체를 사용해 각 작업의 ID와 페이지 수를 저장하고, `queue`를 사용해 작업을 관리했습니다. `front()`와 `pop()`으로 맨 앞의 작업을 처리하고, 작업이 끝나면 대기열에서 제거하는 방식으로 구현했습니다.

 

5. 정리

`queue`는 데이터를 순서대로 처리해야 할 때 유용한 자료구조입니다.  `push()`, `pop()`, `front()` 등의 기본 함수를 사용해 데이터를 효율적으로 관리할 수 있습니다. 대기열을 필요로 하는 다양한 상황, 예를 들어 고객 서비스나 작업 대기열 등에 유용하게 사용할 수 있습니다.

반응형