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`의 기본적인 사용법과 주요 함수들, 그리고 간단한 응용 예제를 통해 큐가 어떻게 활용될 수 있는지 살펴보았습니다.
큐는 매우 유용한 자료구조이므로, 다양한 상황에서 효과적으로 활용할 수 있습니다. 큐를 잘 이해하고 사용하면 더 나은 프로그램을 작성할 수 있을 것입니다.
'Programming' 카테고리의 다른 글
Git브랜치 분기점 확인하는 방법 (0) | 2024.07.15 |
---|---|
Leetcode 알고리즘 스터디 (Palindrome Number) (0) | 2024.07.03 |
C++ Stack 사용법 (0) | 2024.07.03 |
C++ 대문자/소문자 변환하기 (1) | 2024.07.03 |
Leetcode 알고리즘 스터디 (two sum) (0) | 2024.07.03 |