문제
이번에는 STL Queue 를 학습해 보자.
Queue 를 선언하는 방법은 아래와 같다.
#include <queue>
using namespace std;
queue <int> q;
위 코드에서, <int> 는 큐에 담을 자료형을 의미하고, q 는 그 큐의 이름이다. ( 큐 이름은 자유롭게 설정 가능 )
즉, 이 예시에선 q 는 int 를 담는 큐가 된다.
※ 실제 문제에서 사용하는 큐는 구조체를 담는 경우가 많다.
이 문제에서는 큐에 구조체를 담는 연습을 해볼 것이다.
struct Data{
int x, y, z;
};
queue <Data> qq;
Data 는 (x좌표, y좌표, z좌표) 를 담는 구조체이고, qq 는 Data 구조체를 담을 수 있는 큐인 것이다.
이제 본격적으로 STL Queue 의 함수들을 알아보자.
함수 1 : empty()
사용 예시 : if ( qq.empty() == true )...
STL Stack 과 마찬가지로 STL Queue 도 empty() 함수가 있다.
비어있으면 true, 안 비어있으면 false 를 return 한다.
함수 2 : push()
사용 예시 : qq.push( { 1, 2, 4 } );
push() 함수는 큐의 맨 뒤에 원소를 삽입하는 함수다.
위 코드처럼 { 1, 2, 4 } 를 push() 함수에 넣어주면, ( x = 1, y = 2, z = 4 ) 인 Data 구조체가 qq 에 삽입되는 것이다.
( 반드시 구조체에 선언된 변수 순서대로, { 중괄호 } 를 씌워서 넣어주자! )
함수 3 : pop()
사용 예시 : qq.pop();
pop() 함수는 큐의 맨 앞 원소(front)를 삭제하는 함수다.
삭제만 할 뿐, 삭제된 원소를 알려주지는 않는다.
STL Stack 과 마찬가지로, 큐가 비어있는데 pop() 을 호출하면 런타임 에러가 난다. ( 반드시 미리 empty() 함수를 통해 비어있는지부터 확인하자. )
함수 4 : front()
사용 예시 : Data f = qq.front(); 또는 if ( qq.front().y == 2 ) ...
front() 함수는 큐의 맨 앞 원소(front)의 값을 알려주는 함수다. ( 값을 알려주기만 할 뿐, 삭제하지 않는다. )
위 코드에서는 qq 가 Data 구조체를 담는 큐였다.
따라서 qq.front() 는 Data 구조체를 return 할 것이므로, Data f 를 선언하여 담아준 것이다.
f.x, f.y, f.z 를 통해 f 의 x, y, z 값을 알 수 있다.
front() 함수도 큐가 비어있는데 호출되면 런타임 에러가 난다. ( 반드시 미리 empty() 함수를 통해 비어있는지부터 확인하자. )
함수 5 : size()
사용 예시 : if ( qq.size() == 0 ) ... 또는 int s = qq.size();
size() 함수는 STL Stack 과 마찬가지로, 큐의 원소 개수를 알려준다.
큐가 비어있다면 size() 함수는 0 을 return 할 것이다.
이제 위 5가지 함수를 이용하여 아래 문제를 풀어보자.
<처리조건>
주어진 명령은 다음의 4가지이다.
명령 1 : "i x y z" 는 (x, y, z) 구조체를 큐에 삽입한다. x, y, z 는 모두 int 범위의 정수다.
명령 2 : "o" 는 큐의 맨 앞 구조체를 삭제 후, 그 구조체의 x, y, z 값을 공백으로 구분하여 출력한다.
만약 큐가 비어있었다면, "empty" 를 출력한다.
명령 3 : "c" 는 큐에 담겨있는 구조체의 개수를 출력한다.
명령 4 : "z a" 는 큐의 맨 앞 구조체의 z 값이 a 라는 정수와 일치하는지를 출력한다.
일치하면 "yes"를 출력하고, 큐가 비어있었거나 일치하지 않으면 "no" 를 출력한다.
입력
첫 줄에 N이 주어진다. N은 주어지는 명령의 수이다. (1≤N≤10,000)
둘째 줄부터 N+1줄까지 N개의 명령이 주어지는데, 한 줄에 하나씩 주어진다.
출력
출력을 요구하는 명령에 대한 출력 값을 한 줄에 하나씩 출력한다.
출력 내용이 하나도 없는 경우는 주어지지 않는다.
예제1
18
o
z 36901969
c
i 42323453 57112519 4814100
i 4643856 67128971 42927065
z 4814100
c
z 4814100
o
z 75068631
c
z 42927065
z 93403458
z 30337753
i 14399968 2553408 64342658
o
i 4062724 80834965 31516244
c
empty
no
0
yes
2
yes
42323453 57112519 4814100
no
1
yes
no
no
4643856 67128971 42927065
2