ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 큐의 κ°œλ…κ³Ό STL Queue μ‚¬μš©λ²•
    Algorithm & Data Structure 2022. 1. 17. 22:31
    λ°˜μ‘ν˜•

    λ“€μ–΄κ°€λ©°

     νλŠ” λ¨Όμ € λ“€μ–΄κ°„ μ›μ†Œκ°€ λ¨Όμ € λ‚˜μ˜€κ²Œ λ˜λŠ” κ΅¬μ‘°μ—¬μ„œ FIFO(First In First Out) 자료ꡬ쑰라고 λΆ€λ₯Έλ‹€. 그리고 C++ STL에 큐가 κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄ μ‰½κ²Œ μ΄μš©ν•  수 μžˆλ‹€! νλŠ” BFS, Flood Fill μ•Œκ³ λ¦¬μ¦˜μ— 보톡 μ‚¬μš©ν•œλ‹€.

     

    큐(Queue) λž€?

    큐(queue)λŠ” μ»΄ν“¨ν„°μ˜ 기본적인 μžλ£Œ ꡬ쑰의 ν•œκ°€μ§€λ‘œ, λ¨Όμ € 집어 넣은 λ°μ΄ν„°κ°€ λ¨Όμ € λ‚˜μ˜€λŠ” FIFO(First In First Out)ꡬ쑰둜 μ €μž₯ν•˜λŠ” ν˜•μ‹μ„ λ§ν•œλ‹€. μ˜μ–΄ 단어 queueλŠ” ν‘œλ₯Ό μ‚¬λŸ¬ 일렬둜 λŠ˜μ–΄μ„  μ‚¬λžŒλ“€λ‘œ 이루어진 쀄을 λ§ν•˜κΈ°λ„ ν•˜λ©°, λ¨Όμ € 쀄을 μ„  μ‚¬λžŒμ΄ λ¨Όμ € λ‚˜κ°ˆ 수 μžˆλŠ” 상황을 μ—°μƒν•˜λ©΄ λœλ‹€.
    λ‚˜μ€‘μ— 집어 넣은 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” μŠ€νƒκ³ΌλŠ” λ°˜λŒ€λ˜λŠ” κ°œλ…μ΄λ‹€.
    ν”„λ¦°ν„°μ˜ μΆœλ ₯ μ²˜λ¦¬λ‚˜ μœˆλ„ μ‹œμŠ€ν…œμ˜ λ©”μ‹œμ§€ 처리기, ν”„λ‘œμ„ΈμŠ€ 관리 λ“± 데이터가 μž…λ ₯된 μ‹œκ°„ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆλŠ” 상황에 μ΄μš©λœλ‹€.

    - μœ„ν‚€λ°±κ³Ό

     

    큐

     νμ— λŒ€ν•΄μ„œ μ•„λž˜μ˜ 사진을 보고 μ΄ν•΄ν•΄λ³΄μž.

     μœ„ 사진을 보면 μ›μ†Œ 32λ₯Ό λ„£μ–΄μ„œ 큐 μ•ˆμ— μ›μ†Œκ°€ 5, 17, 32κ°€ λ“€μ–΄μžˆκ²Œ λ˜μ—ˆλ‹€. μ—¬κΈ°μ„œ μ›μ†Œλ₯Ό μ œκ±°ν•˜λ©΄ κ°€μž₯ λ¨Όμ € λ“€μ–΄μ™€μžˆλŠ” μ›μ†ŒμΈ 5κ°€ λΉ μ Έλ‚˜κ°„λ‹€. μ΄λŸ¬ν•œ ꡬ쑰λ₯Ό 큐라고 λΆ€λ₯Έλ‹€.

     

    큐의 μ„±μ§ˆ

    1.  μ›μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ›μ†Œλ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄ O(1)의 μ‹œκ°„ λ³΅μž‘λ„κ°€ ν•„μš”ν•˜λ‹€.
    2.  μ œμΌ μƒλ‹¨μ˜ μ›μ†Œμ™€ 제일 ν•˜λ‹¨μ˜ μ›μ†Œλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ O(1)의 μ‹œκ°„ λ³΅μž‘λ„κ°€ ν•„μš”ν•˜λ‹€.
    3.  μ œμΌ 상단에 μžˆλŠ” μ›μ†Œμ™€ 제일 ν•˜λ‹¨μ— μžˆλŠ” μ›μ†Œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μ›μ†Œλ“€μ„ ν™•μΈν•˜κ±°λ‚˜ λ³€κ²½ν•˜λŠ” 것은 μ›μΉ™μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€. (배열을 μ΄μš©ν•΄ 큐λ₯Ό κ΅¬ν˜„ν•˜λ©΄ ν™•μΈν•˜κ±°λ‚˜ λ³€κ²½κ°€λŠ₯ν•˜λ„λ‘ λ§Œλ“€ 수 μžˆλ‹€.)

     

    STL Queue

     μ•„λž˜λŠ” queue 헀더 파일의 선언이닀.

    #include <queue>
    ...

     

    Queue μ„ μ–Έ

    #include <iostream>
    #include <queue>
    using namespace std;
    
    int main(void) {
    	
    	queue<int> Q; // λΉ„μ–΄μžˆλŠ” int queue μ„ μ–Έ
    	
    	return 0;
    }

     

    Queue κ°’ μΆ”κ°€

     queue에 값을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œλŠ” push() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

    #include <iostream>
    #include <queue>
    using namespace std;
    
    int main(void) {
    	
    	queue<int> Q; // λΉ„μ–΄μžˆλŠ” int queue μ„ μ–Έ
    	
    	Q.push(1); // 1
    	Q.push(2); // 1 2
    	Q.push(3); // 1 2 3
    	
    	return 0;
    }

     

    Queue 크기

     queue의 크기λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” size() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 queueκ°€ λΉ„μ–΄μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ empty() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.

    #include <iostream>
    #include <queue>
    using namespace std;
    
    int main(void) {
    	
    	queue<int> Q; // λΉ„μ–΄μžˆλŠ” int queue μ„ μ–Έ
    	
    	Q.push(1); // 1
    	Q.push(2); // 1 2
    	Q.push(3); // 1 2 3
    	
    	cout << Q.size() << '\n'; // 3
    	
    	if (!Q.empty()) {
    		cout << "queue is not empty!" << '\n';
    	}
    	
    	return 0;
    }

     

    Queue κ°’ μ‚­μ œ

     queue에 값을 μ‚­μ œν•˜κΈ° μœ„ν•΄μ„œ pop() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 큐가 λΉ„μ–΄μžˆλŠ” 데 pop() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€!

    #include <iostream>
    #include <queue>
    using namespace std;
    
    int main(void) {
    	
    	queue<int> Q; // λΉ„μ–΄μžˆλŠ” int queue μ„ μ–Έ
    	
    	Q.push(1); // 1
    	Q.push(2); // 1 2
    	Q.push(3); // 1 2 3
    	
    	cout << Q.size() << '\n'; // 3
    	
    	if (!Q.empty()) {
    		cout << "queue is not empty!" << '\n';
    	}
    	
    	Q.pop(); // 2 3
    	
    	return 0;
    }

     

    Queue κ°’ 확인

     STL Queueμ—μ„œλŠ” 제일 μƒλ‹¨μ˜ μ›μ†Œμ™€ 제일 ν•˜λ‹¨μ˜ μ›μ†Œ μ΄μ™Έμ˜ μ›μ†Œμ˜ 값을 ν™•μΈν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μ—†λ‹€. 큐의 제일 상단 μ›μ†Œμ˜ 값을 ν™•μΈν•˜κΈ° μœ„ν•΄ front() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³ , 큐의 제일 ν•˜λ‹¨ μ›μ†Œμ˜ 값을 ν™•μΈν•˜κΈ° μœ„ν•΄ back() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 그리고 큐가 λΉ„μ–΄μžˆλŠ” 데 front() ν•¨μˆ˜λ‚˜ back() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€!

    #include <iostream>
    #include <queue>
    using namespace std;
    
    int main(void) {
    	
    	queue<int> Q; // λΉ„μ–΄μžˆλŠ” int queue μ„ μ–Έ
    	
    	Q.push(1); // 1
    	Q.push(2); // 1 2
    	Q.push(3); // 1 2 3
    	
    	cout << Q.size() << '\n'; // 3
    	
    	if (!Q.empty()) {
    		cout << "queue is not empty!" << '\n';
    	}
    	
    	Q.pop(); // 2 3
    	
    	cout << Q.front() << '\n'; // 2
    	cout << Q.back() << '\n'; // 3
    	
    	return 0;
    }

     

    λ°˜μ‘ν˜•
Designed by Tistory.