1. queue란?
queue(큐)는 FIFO(First In, First Out, 선입선출) 방식으로 동작하는 자료구조입니다. 먼저 들어온 데이터가 먼저 나가므로, 줄을 서는 대기열과 같은 구조를 가집니다.
2. queue의 원리
queue는 두 개의 주요 연산을 가집니다.
- push(): 데이터를 큐의 끝에 추가합니다.
- pop(): 큐의 앞(front)에 있는 데이터를 제거합니다.
이외에도 다음과 같은 주요 연산이 제공됩니다.
- front(): 큐의 가장 앞(front) 요소를 확인합니다.
- back(): 큐의 가장 뒤(back) 요소를 확인합니다.
- empty(): 큐가 비어있는지 확인합니다.
- size(): 큐의 크기를 반환합니다.
3. queue 사용법 정리
3.1. queue 선언 및 기본 사용법
#include <stdio.h>
#include <queue>
using namespace std;
int main() {
queue<int> q;
q.push(10);
q.push(20);
q.push(30);
printf("Front: %d\n", q.front()); // 10
printf("Back: %d\n", q.back()); // 30
q.pop();
printf("Front after pop: %d\n", q.front()); // 20
return 0;
}
3.2. queue의 주요 연산 예제
#include <stdio.h>
#include <queue>
using namespace std;
int main() {
queue<int> q;
for (int i = 1; i <= 5; i++) {
q.push(i * 10); // 10, 20, 30, 40, 50 삽입
}
printf("Queue size: %d\n", (int)q.size());
while (!q.empty()) {
printf("Front: %d\n", q.front());
q.pop();
}
return 0;
}
3.3. queue를 활용한 다양한 예제
3.3.1. 문자열을 저장하는 queue
#include <stdio.h>
#include <queue>
#include <string>
using namespace std;
int main() {
queue<string> q;
q.push("Hello");
q.push("World");
q.push("Queue");
while (!q.empty()) {
printf("%s\n", q.front().c_str());
q.pop();
}
return 0;
}
3.3.2. 구조체를 저장하는 queue
#include <stdio.h>
#include <queue>
using namespace std;
struct Person {
int id;
char name[20];
};
int main() {
queue<Person> q;
q.push({1, "Alice"});
q.push({2, "Bob"});
q.push({3, "Charlie"});
while (!q.empty()) {
Person p = q.front();
printf("ID: %d, Name: %s\n", p.id, p.name);
q.pop();
}
return 0;
}
4. queue의 시간 복잡도
연산 | 시간 복잡도 |
push() | O(1) |
pop() | O(1) |
front() | O(1) |
back() | O(1) |
empty() | O(1) |
size() | O(1) |
queue의 모든 연산은 상수 시간(O(1)) 에 수행되므로 매우 효율적입니다.
5. queue 사용 시 주의사항
- 큐가 비어있을 때 front() 또는 pop()을 호출하면 오류가 발생할 수 있습니다.
if (!q.empty()) { printf("Front: %d\n", q.front()); }
- 큐는 중간 삽입/삭제가 불가능합니다.
- 큐의 중간 데이터를 수정하려면 다른 구조를 고려해야 합니다.
6. 코딩 테스트에서 queue 활용 패턴
6.1. BFS(너비 우선 탐색)에서 queue 활용
#include <stdio.h>
#include <queue>
using namespace std;
int visited[100] = {0};
int graph[100][100] = {0};
void bfs(int start) {
queue<int> q;
q.push(start);
visited[start] = 1;
while (!q.empty()) {
int node = q.front();
q.pop();
printf("Visit: %d\n", node);
for (int i = 0; i < 100; i++) {
if (graph[node][i] && !visited[i]) {
q.push(i);
visited[i] = 1;
}
}
}
}
6.2. 최근 사용된 데이터 관리 (LRU 캐싱 등)
#include <stdio.h>
#include <queue>
using namespace std;
#define CACHE_SIZE 3
queue<int> cache;
void accessData(int data) {
if (cache.size() == CACHE_SIZE) {
cache.pop();
}
cache.push(data);
}
int main() {
accessData(1);
accessData(2);
accessData(3);
accessData(4); // 가장 오래된 데이터(1)가 제거됨
while (!cache.empty()) {
printf("Cache: %d\n", cache.front());
cache.pop();
}
return 0;
}
7. 요약
- queue는 선입선출(FIFO) 방식을 따르는 기본적인 자료구조입니다.
- 모든 연산이 O(1) 시간 복잡도로 동작하여 빠릅니다.
- BFS, 캐싱, 프로세스 스케줄링 등 다양한 곳에서 활용됩니다.
- 중간 삽입/삭제가 필요하면 다른 구조를 고려해야 합니다.
함께 보면 좋은 글 - STL 사용법 총정리 시리즈
2025.02.22 - [STL] - [C언어/C++] STL Iterator 총정리 - 개념, 원리, 사용법, 시간복잡도, 코딩 테스트 활용법
[C언어/C++] STL Iterator 총정리 - 개념, 원리, 사용법, 시간복잡도, 코딩 테스트 활용법
코딩 테스트에서 STL을 활용하면 효율적인 자료구조 및 알고리즘 구현이 가능합니다. STL을 사용할 때 가장 중요한 개념 중 하나가 바로 Iterator(반복자)입니다. 모든 STL 컨테이너(queue, stack, map, unor
best-coding.tistory.com
2025.02.22 - [STL] - [C언어/C++] auto 키워드 완벽 정리 - 개념, 원리, 사용법, 예제, 주의사항
[C언어/C++] auto 키워드 완벽 정리 - 개념, 원리, 사용법, 예제, 주의사항
C++에서 auto 키워드는 변수의 타입을 자동으로 추론해주는 기능을 제공합니다. C++11부터 도입된 이 기능은 코드의 가독성을 높이고, 유지보수를 용이하게 만드는 중요한 역할을 합니다. 본 포스
best-coding.tistory.com
'STL' 카테고리의 다른 글
[C언어/C++] STL 스택(Stack) 총정리 - 개념, 사용법, 시간복잡도, 예제코드, 코딩테스트 활용, 주의점 (0) | 2025.02.25 |
---|---|
[C언어/C++] auto 키워드 완벽 정리 - 개념, 원리, 사용법, 예제, 주의사항 (0) | 2025.02.22 |
[C언어/C++] STL Iterator 총정리 - 개념, 원리, 사용법, 시간복잡도, 코딩 테스트 활용법 (0) | 2025.02.22 |
[C언어/C++] STL: Vector 사용법 총 정리: 개념, 주요함수, 예제코드 (3) | 2024.12.23 |
코딩테스트에서 자주 쓰이는 STL 총정리 (1) | 2024.12.23 |
댓글