큐
큐
는 한쪽 끝에서 원소를 넣고 반대쪽 끝에서 원소를 뺄 수 있는 자료구조
FIFO
(First In First Out) 형식을 따른다.
- 원소의 추가가
O(1)
- 원소의 제거가
O(1)
- 제일 앞/뒤 원소의 확인이
O(1)
- 양 끝의 원소를 제외하고, 나머지 원소들의 확인/변경이 불가능하다.
- 원소의 삭제가 발생하는 맨 앞을
front
라고 하며, 원소의 삽입이 발생하는 맨 뒤를 rear
라고 한다.
배열을 통한 큐 구현
#include <iostream>
using namespace std;
const int MX = 1000005;
int dat[MX];
int head = 0, tail = 0;
void push(int x){
dat[tail++] = x;
}
void pop(){
head++;
}
int front(){
return dat[head];
}
int back(){
return dat[tail-1];
}
void test(){
push(10); push(20); push(30);
cout << front() << '\n';
cout << back() << '\n';
pop(); pop();
push(15); push(25);
cout << front() << '\n';
cout << back() << '\n';
}
int main(void) {
test();
}
head
는 배열의 맨 앞 원소를 가리키고, tail
은 배열의 마지막 원소 + 1을 가리킨다.
- 따라서
큐
의 size
는 tail
- head
로 쉽게 접근이 가능하다.
- 삭제 연산은 단순히
head
를 1 증가
시키면된다.
- 이 배열 구현의
단점
은 삽입/삭제
연산이 반복되서 실행된 후, 큐의 맨 처음 원소 앞에 낭비되는 공간이 생긴다는 점이다.
- 이를 극복한 큐가
원형 큐
이다.
- 하지만 코딩테스트에서는
push
, pop
연산의 횟수가 정해져 있음으로 배열의 크기를 충분히 크게 한다면 문제될 것은 없다.
STL queue
#include <bits/stdc++.h>
using namespace std;
int main(void) {
queue<int> Q;
Q.push(10);
Q.push(20);
Q.push(30);
cout << Q.size() << '\n';
if(Q.empty()) cout << "Q is empty\n";
else cout << "Q is not empty\n";
Q.pop();
cout << Q.front() << '\n';
cout << Q.back() << '\n';
Q.push(40);
Q.pop();
cout << Q.front() << '\n';
}