본문 바로가기
Programming

C++ Queue 사용법

by 느리게 걷는 즐거움 2024. 7. 3.
반응형


C++에서 Queue 사용하기

큐(Queue)는 데이터 구조 중 하나로, 데이터를 선입선출(FIFO, First In First Out) 방식으로 저장하고 관리하는 구조입니다. 큐는 주로 작업 예약, 데이터 스트림 처리, 너비 우선 탐색 등 다양한 분야에서 사용됩니다. 이번 글에서는 C++ 표준 라이브러리에서 제공하는 `queue`를 사용하는 방법에 대해 알아보겠습니다.

`queue` 헤더 파일 포함

C++에서 `queue`를 사용하려면 표준 라이브러리의 `<queue>` 헤더 파일을 포함해야 합니다.

#include <queue>

큐의 기본 사용법

큐는 템플릿 클래스이므로, 사용할 데이터 타입을 지정하여 선언합니다. 예를 들어, 정수를 저장하는 큐를 선언하려면 다음과 같이 작성합니다.

std::queue<int> myQueue;

주요 함수와 사용 예제

`push`

`push` 함수는 큐의 뒤에 새로운 요소를 추가합니다.

#include <iostream>
#include <queue>

int main() {
    std::queue<int> myQueue;

    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);

    std::cout << "큐의 첫 번째 요소: " << myQueue.front() << std::endl;

    return 0;
}

 

위의 예제에서는 `10`, `20`, `30`을 차례로 큐에 추가합니다. 첫 번째로 추가된 `10`이 큐의 앞에 위치합니다.

`pop`

`pop` 함수는 큐의 첫 번째 요소를 제거합니다. 그러나 제거된 요소를 반환하지는 않습니다. 따라서 `front` 함수를 사용하여 요소를 제거하기 전에 그 값을 확인하는 것이 일반적입니다.

#include <iostream>
#include <queue>

int main() {
    std::queue<int> myQueue;

    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);

    std::cout << "큐의 첫 번째 요소: " << myQueue.front() << std::endl;

    myQueue.pop();
    std::cout << "pop() 호출 후 큐의 첫 번째 요소: " << myQueue.front() << std::endl;

    return 0;
}

 

 `front`와 `back`

`front` 함수는 큐의 첫 번째 요소를 반환하고, `back` 함수는 큐의 마지막 요소를 반환합니다.

#include <iostream>
#include <queue>

int main() {
    std::queue<int> myQueue;

    myQueue.push(10);
    myQueue.push(20);
    myQueue.push(30);

    std::cout << "큐의 첫 번째 요소: " << myQueue.front() << std::endl;
    std::cout << "큐의 마지막 요소: " << myQueue.back() << std::endl;

    return 0;
}

 

`empty`

`empty` 함수는 큐가 비어 있는지 여부를 확인합니다. 비어 있으면 `true`를, 그렇지 않으면 `false`를 반환합니다.

#include <iostream>
#include <queue>

int main() {
    std::queue<int> myQueue;

    std::cout << "큐가 비어 있는가? " << (myQueue.empty() ? "네" : "아니오") << std::endl;

    myQueue.push(10);
    std::cout << "큐가 비어 있는가? " << (myQueue.empty() ? "네" : "아니오") << std::endl;

    return 0;
}
`size`

`size` 함수는 큐에 있는 요소의 개수를 반환합니다.

#include <iostream>
#include <queue>

int main() {
    std::queue<int> myQueue;

    myQueue.push(10);
    myQueue.push(20);

    std::cout << "큐의 크기: " << myQueue.size() << std::endl;

    return 0;
}

큐의 응용 예제큐는 다양한 상황에서 유용하게 사용할 수 있습니다. 여기서는 큐를 사용하여 너비 우선 탐색(BFS, Breadth-First Search) 알고리즘을 구현하는 간단한 예제를 살펴보겠습니다. 너비 우선 탐색은 그래프나 트리에서 시작 정점으로부터 각 정점까지의 최단 경로를 찾는 알고리즘입니다.

#include <iostream>
#include <queue>
#include <vector>

void BFS(int start, const std::vector<std::vector<int>>& adjList) {
    std::queue<int> q;
    std::vector<bool> visited(adjList.size(), false);

    q.push(start);
    visited[start] = true;

    while (!q.empty()) {
        int current = q.front();
        q.pop();

        std::cout << current << " ";

        for (int neighbor : adjList[current]) {
            if (!visited[neighbor]) {
                q.push(neighbor);
                visited[neighbor] = true;
            }
        }
    }
}

int main() {
    std::vector<std::vector<int>> adjList = {
        {1, 2},    // 0번 노드의 인접 노드들
        {0, 3, 4}, // 1번 노드의 인접 노드들
        {0, 4},    // 2번 노드의 인접 노드들
        {1, 5},    // 3번 노드의 인접 노드들
        {1, 2, 5}, // 4번 노드의 인접 노드들
        {3, 4}     // 5번 노드의 인접 노드들
    };

    std::cout << "너비 우선 탐색 결과: ";
    BFS(0, adjList);
    std::cout << std::endl;

    return 0;
}

 

위 예제에서는 주어진 인접 리스트를 사용하여 그래프를 나타내고, `BFS` 함수를 통해 너비 우선 탐색을 수행합니다. 큐를 사용하여 현재 정점의 이웃들을 방문하고, 방문한 정점을 순서대로 출력합니다.

결론

이번 글에서는 C++ 표준 라이브러리의 `queue`를 사용하는 방법에 대해 알아보았습니다. `queue`의 기본적인 사용법과 주요 함수들, 그리고 간단한 응용 예제를 통해 큐가 어떻게 활용될 수 있는지 살펴보았습니다. 

큐는 매우 유용한 자료구조이므로, 다양한 상황에서 효과적으로 활용할 수 있습니다. 큐를 잘 이해하고 사용하면 더 나은 프로그램을 작성할 수 있을 것입니다.

반응형