코테/항해99

[99클럽 코테 스터디 14일차 TIL] #스택/ 큐 3

쪼성윤 2024. 11. 11. 00:05

코테 스터디를 시작한 지도 벌써 2주가 다 되어가네요. 시간이 참 빠른 것 같아요. 오늘도 파이팅입니다!

 

문제 설명


 

오늘의 문제는 말그대로 큐를 구현해 보는 문제였습니다. 직접 구현을 해보면서 '큐'라는 자료구조에 대해 알아볼 수 있는 문제였습니다.

 

생각 흐름


음.. 이 문제는 '큐'라는 자료구조를 다시 떠올릴 수 있었던 문제였던 것 같습니다.

 

'큐'라는 자료구조는 대표적인 선입선출(FIFO) 알고리즘으로, push pop empty front back swap 등의 기본함수가 있다는 것을 떠올렸던 것 같아요.

 

예전에 배운 '스택'과 다른점은 front와 back 원소에 접근할 수 있다는 점을 기억해 냈죠.

 

<queue> 헤더파일을 include 해주고 각 함수마다 q의 기능들을 적어줬어요.

 

큐는 자료가 저장되어서 front부터 나온다는 점을 살려 각 함수를 알맞게 구현해 주었습니다.

 

큐가 비어있으면 1을 출력해 주는 empty() 함수도 각 함수마다 달아주어 예외처리도 해주며 마무리했습니다.

 

#include <iostream>
#include <queue>
using namespace std;

queue <int> q;

int main () {
	int n;
	cin >> n;

	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;

		if (s == "push") {
			int j;
			cin >> j;
			q.push(j);
		}

		else if (s == "pop") {
			if (q.empty()) {
				cout << -1 << "\n";
			}
			else {
				cout << q.front() << "\n";
				q.pop();
			}
		}

		else if (s == "front")
		{
			if (q.empty())
				cout << -1 << '\n';
			else
				cout << q.front() << '\n';
		}
		else if (s == "back")
		{
			if (q.empty())
				cout << -1 << '\n';
			else
				cout << q.back() << '\n';
		}
		else if (s == "size")
		{
			cout << q.size() << '\n';
		}
		else if (s == "empty")
		{
			cout << q.empty() << '\n';
		}
		
	}

	return 0;
}

 

 

공부한 내용 정리


📌1. 큐

 

큐(Queue)는 대표적인 FIFO(First In First Out) 구조입니다.
따라서 제일 처음에 넣은 데이터가 처음으로 빠져나오는 것을 볼 수 있습니다.
큐의 기본함수에는 push, pop, empty, front, back, swap 등이 있습니다.
스택과 달리 front 원소와 back 원소에 접근할 수 있다는 점이 특징입니다.

 

출처 : 위키피디아

 

 

📌2. 큐 헤더 파일

Queue STL을 사용하기 위해서는 헤더파일을 포함해야 합니다.
queue <데이터 타입> 이름 ; 으로 queue을 선언합니다.

#include <queue> queue<int> q;

 

📌3. 큐 기본 함수

▷ 큐에 데이터 추가하기
큐이름. push(데이터) 형태로 데이터를 추가합니다.

queue.push(element)


큐에 데이터 삭제하기
큐이름. pop( ) 형태로 큐의 front 데이터를 삭제합니다.

queue.pop()


▷ 큐의 첫 번째 데이터 반환
큐이름. front() 형태로 제일 최상위 데이터를 반환합니다.

queue.front()


▷ 큐의 마지막 데이터 반환
큐이름. back() 형태로 제일 마지막 데이터를 반환합니다.

queue.back()


▷ 큐의 사이즈 반환
큐이름. size() 형태로 큐의 현재 사이즈를 반환합니다.

queue.size()


▷ 큐가 비어있는지 확인
큐이름. empty() 형태로 큐가 비어있는지 확인합니다.

queue.empty()



▷ 큐 SWAP : 두 큐의 내용 바꾸기
큐 1과 큐 2 두 큐의 내용을 바꾸고 싶은 경우, 내장된 swap 함수를 사용합니다.
swap(큐 1 이름, 큐 2 이름) 형태로 두 큐의 내용을 바꿉니다.

swap(queue1 , queue2)


▷ 큐 기본 사용법 예시
1. 큐 q1 에는 1, 2, 3 데이터를 queue.push(element) 함수를 사용해 삽입했습니다.
2. 큐 q2 에는 10, 20,30 데이터를 queue.push(element) 함수를 사용해 삽입했습니다.
3. 큐 q1와 큐 q2를 바꾸어주었습니다.
4. 큐가 비어있을 때까지 queue.front 데이터를 출력하며 pop 해주었습니다.

#include <iostream> 
#include <queue> 
using namespace std; 

int main(void) { 
    queue<int> q1; 
    queue<int> q2; 
    q1.push(1); 
    q1.push(2); 
    q1.push(3); 
    q2.push(10); 
    q2.push(20); 
    q2.push(30); 
    swap(q1, q2); 
    
    while (!q1.empty()) { 
    	cout << q1.front() << endl; 
        q1.pop(); 
    } 
        
	return 0; 
}


출력결과는 다음과 같습니다. 10 20 30 이 출력이 되었습니다.
q1에는 1,2,3 데이터를 넣었지만, q2와 SWAP 되어 10 20 30 데이터가 저장된 것을 볼 수 있습니다.

10 20 30

 

 

출처: 코딩젤리 블로그

깔끔하게 정리를 잘해주셨더라고요. 꼼꼼히 읽어보면서 코드도 다시 구현해 보았습니다.