일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- nightroutine
- 직무면접
- 원서읽자
- D4
- STUDYENGLISH
- sw expert
- 코딩테스트
- 알고리즘 문제
- MySQL
- 완전탐색
- sw expert academy
- 코테 대비
- 코테 준비
- swexpertacademy
- PyQt
- BFS
- 쉬운 알고리즘 문제
- SQL
- englishbook
- 알고리즘
- 원서
- readingbook
- 프로그래머스
- 코테
- 삼성
- the midnight library
- dfs
- 원서읽기
- English
- 백준
- Today
- Total
시나브로
[ 자료구조 ] 큐 Queue 정리 및 STL 사용법 본문
# 큐를 이용한 문제를 풀고 싶다면, 블로그에서 큐를 검색하면 관련 문제 풀이 글을 보실 수 있습니다. 그 글에 문제 링크도 있으니 한 번 풀어보시는 걸 추천합니다.
큐란?
큐란, FIFO의 구조를 가진 자료구조를 의미한다. 여기서 FIFO는 First In First Out이다. 처음 입력된 요소가 가장 먼저 출력된다.
위의 그림을 참조하면 이해하기 쉬울 것이다.
- 3을 입력을 하게 되면 맨 앞에 위치합니다
- 이어 4를 입력하면 3 뒤에 위치하게 됩니다
- 위의 과정을 반복합니다
- Pop을 하면 가장 앞에 있는 요소인 3을 출력하고 삭제합니다
이러한 과정으로 삽입/삭제가 이루어지는 것을 FIFO라고합니다. FIFO의 대표적 자료구조는 큐입니다
큐 활용
- 너비 우선 탐색 구현 : 연결된 모든 노드를 큐에 입력을 하고 순회를 할 때, pop하면서 순회를 합니다.
- 캐시구현
- 티켓 카운터와 같은 선입선출이 필요한 대기열
- 콜센터 고객 대기시간
- 프린터의 출력 처리
- 윈도 시스템의 메시지 처리기
- 프로세스 관리
큐 구현 _ 배열
#include <iostream>
using namespace std;
int main() {
int list[1000] = { 0 };
// 배열 선언시,초기화를 필수적입니다.
int front_point = 0;
int end_point = -1;
for (int i = 0;i < 10;i++) {
list[++end_point] = i;
}
// list 상태 : 0 1 2 3 4 5 6 7 8 9
list[front_point--]=0;
// list 상태 : 1 2 3 4 5 6 7 8 9
list[front_point--] = 0;
// list 상태 : 2 3 4 5 6 7 8 9
return 0;
}
이렇게 배열로 큐를 구현하고 큐의 맨앞 요소를 가리키는 변수 하나하고 맨끝 요소를 가리키는 변수하나 총 2개의 변수로 인덱스를 관리한다.
큐에 요소를 입력할 경우, end_point를 증감시키고 그 위치에 추가한다. 삭제할 경우, front_point 위치의 값을 0으로 만드고 front_point를 감소시켜준다.
여기서 치명적인 단점이 나온다. 바로 공간의 낭비이다. 자료를 입력하고 pop을 할수록 나중에 입력할 수 있는 여유공간이 부족해진다.
단순히 모든 데이터를 앞으로 이동시키면 되지 않냐라는 의문을 가질 수 있다. 이는 적은 데이터일 때는 가능하지만, 데이터량이 만단위가 되면 이동시키는데 너무 많은 시간이 걸리기에 부적합하다. 그렇기에 배열로 큐를 사용할 때는 주의가 필요하다.
큐 구현 _ STL
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<int> q;
for (int i = 0;i < 10;i++) {
q.push(i);
}
// q의 상태 : 0 1 2 3 4 5 6 7 8 9
cout<< q.front();
//q.front()의 요소 : 0
q.pop();
// q의 상태 : 1 2 3 4 5 6 7 8 9
q.pop();
// q의 상태 : 2 3 4 5 6 7 8 9
return 0;
}
큐 STL을 사용하기 위해서는 필수적으로 #include <queue> 을 적어주어야한다.
queue<int> q; int형의 큐인 q를 선언한다.
q.push(1); 큐 q에 1을 추가한다.
q. front(); 큐 q의 가장 앞 요소를 의미한다.
q.pop(); 큐 q의 가장 앞 요소를 삭제한다.
q.empty(); 큐 q가 비어있는지 확인한다. 비어있으면 true를 의미하고 안에 값이 있다면 false를 의미하다. 이는 if문에 유용하게 사용된다. ex) if(q.empty()) { (1) } 라고 코딩하면 q 안에 값이 없을 때, (1)의 코드가 실행된다.
q.size(); 큐 q의 크기를 리턴한다. 만약 s에 값이 4개가 들어가 있다면, s.size()는 4를 의미한다. 이는 for문에서 유용하게 사용된다. ex) for(int i=0;i<s.size();i++){ q.pop(); } 처럼 사용하면 for이 q사이즈만큼 돌면서 모든값을 pop할 수 있다.
'프로그래밍 언어 > C ++' 카테고리의 다른 글
[ 자료구조 ] 스택 Stack 정리 및 STL 사용법 (0) | 2020.05.14 |
---|