ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] μŠ€νƒμ˜ κ°œλ…κ³Ό STL Stack μ‚¬μš©λ²•
    Algorithm & Data Structure 2022. 1. 15. 22:46
    λ°˜μ‘ν˜•

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

     μ•žμœΌλ‘œ μ„Έ 가지 κ΄€λ ¨ μžˆλŠ” 자료ꡬ쑰인 μŠ€νƒ, 큐, 덱에 λŒ€ν•΄μ„œ λ‹€λ£° 것이닀. μŠ€νƒμ€ λ¨Όμ € λ“€μ–΄κ°„ μ›μ†Œκ°€ 제일 λ‚˜μ€‘μ— λ‚˜μ˜€κ²Œ λ˜λŠ” κ΅¬μ‘°μ—¬μ„œ FILO(First In Last Out) 자료ꡬ쑰라고 λΆ€λ₯΄κΈ°λ„ ν•œλ‹€. λ˜ν•œ λ°˜λŒ€λ‘œ λ‚˜μ€‘μ— λ“€μ–΄κ°„ μ›μ†Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€κ²Œ λ˜λŠ” κ΅¬μ‘°μ΄λ―€λ‘œ LIFO(Last In First Out)의 ν˜•νƒœλ₯Ό λ λŠ” μžλ£Œκ΅¬μ‘°μ΄κΈ°λ„ ν•˜λ‹€. 그리고 C++ STL에 μŠ€νƒμ΄ κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄ μ‰½κ²Œ μ΄μš©ν•  수 μžˆλ‹€!

     

    μŠ€νƒ(Stack) μ΄λž€?

    μŠ€νƒ(stack)은 μ œν•œμ μœΌλ‘œ μ ‘κ·Όν•  수 μžˆλŠ” λ‚˜μ—΄ ꡬ쑰이닀. κ·Έ μ ‘κ·Ό 방법은 μ–Έμ œλ‚˜ λͺ©λ‘μ˜ λμ—μ„œλ§Œ μΌμ–΄λ‚œλ‹€. 끝먼저내기 λͺ©λ‘(Pushdown list)이라고도 ν•œλ‹€.
    μŠ€νƒμ€ ν•œ μͺ½ λμ—μ„œλ§Œ 자료λ₯Ό λ„£κ±°λ‚˜ λΊ„ 수 μžˆλŠ” μ„ ν˜• ꡬ쑰(LIFO - Last In First Out)으둜 λ˜μ–΄ μžˆλ‹€. 자료λ₯Ό λ„£λŠ” 것을 'λ°€μ–΄λ„£λŠ”λ‹€' ν•˜μ—¬ ν‘Έμ‰¬(push)라고 ν•˜κ³  λ°˜λŒ€λ‘œ λ„£μ–΄λ‘” 자료λ₯Ό κΊΌλ‚΄λŠ” 것을 νŒ(pop)이라고 ν•˜λŠ”λ°, μ΄λ•Œ κΊΌλ‚΄μ§€λŠ” μžλ£ŒλŠ” κ°€μž₯ μ΅œκ·Όμ— ν‘Έμ‰¬ν•œ μžλ£ŒλΆ€ν„° λ‚˜μ˜€κ²Œ λœλ‹€. 이처럼 λ‚˜μ€‘μ— 넣은 값이 λ¨Όμ € λ‚˜μ˜€λŠ” 것을 LIFO κ΅¬μ‘°λΌκ³  ν•œλ‹€.

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

     

    μŠ€νƒ

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

     μœ„ 사진을 보면 32 μ›μ†Œλ₯Ό λ„£κ³ , 47 μ›μ†Œλ₯Ό λ„£μ—ˆλ‹€. 그리고 μ›μ†Œλ₯Ό μ œκ±°ν•  λ•Œ κ°€μž₯ λ§ˆμ§€λ§‰μ— 넣은 47 μ›μ†Œκ°€ λΉ μ Έλ‚˜κ°€λŠ” 것을 μ•Œ 수 μžˆλŠ”λ° μ΄λŸ¬ν•œ ꡬ쑰λ₯Ό μŠ€νƒμ΄λΌκ³  λΆ€λ₯Έλ‹€.

     

    μŠ€νƒμ˜ μ„±μ§ˆ

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

     

    STL Stack

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

    #include <stack>
    ...

     

    Stack μ„ μ–Έ

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

     

    Stack κ°’ μΆ”κ°€

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

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

     

    Stack 크기

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

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

     

    Stack κ°’ μ‚­μ œ

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

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

     

    Stack 제일 상단 κ°’ 확인

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

    #include <iostream>
    #include <stack>
    using namespace std;
    
    int main(void) {
    	
    	stack<int> S; // λΉ„μ–΄μžˆλŠ” int stack μ„ μ–Έ
    	
    	S.push(1); // 1
    	S.push(2); // 1 2
    	S.push(3); // 1 2 3
    	
    	cout << S.size() << '\n'; // 3
    	
    	if (!S.empty()) {
    		cout << "stack is not empty!" << '\n';
    	}
    	
    	S.pop(); // 1 2
    	cout << S.top() << '\n'; // 2
    	
    	S.pop(); // 1
    	cout << S.top() << '\n'; // 1
    	
    	return 0;
    }
    λ°˜μ‘ν˜•
Designed by Tistory.