C++에서 std::stack의 사용법은?
_____Q1: std::stack이란 무엇인가요?
A1: std::stack은 C++ 표준 라이브러리의 컨테이너 어댑터(Container Adapter)로, LIFO(Last In First Out) 구조를 제공하는 자료구조입니다. 내부적으로 다른 컨테이너(vector, deque, list 등)를 감싸며, 스택 특화된 인터페이스만 노출합니다.
Q2: 헤더 파일과 네임스페이스는 어떻게 되나요?
A2:
include
using std::stack;
Q3: 기본 내부 컨테이너는 무엇인가요?
A3: 기본 내부 컨테이너는 std::deque
Q4: 스택을 선언·초기화하는 방법은?
A4:
// 기본형
stack
// 초기 컨테이너를 인자로
deque
stack
// vector 기반 스택
stack
Q5: 주요 멤버 함수에는 무엇이 있나요?
A5:
push(const T&), push(T&&) – 요소 추가
emplace(args…) – 제자리 생성 후 추가
pop() – 최상위 요소 제거
top() / top() const – 최상위 요소 접근
empty() const – 비어 있는지 확인
size() const – 요소 개수 반환
swap(other) – 다른 스택과 내부 데이터 교환
Q6: pop()이나 top() 호출 전 비어 있는지 어떻게 확인하나요?
A6: 무조건 empty()를 호출해 true인지 검사합니다.
if (!s.empty()) { auto v = s.top(); s.pop(); }
Q7: emplace()는 언제 사용하나요?
A7: push()보다 효율적으로 직접 생성자를 호출해 컨테이너에 삽입할 때 사용합니다.
stack
s.emplace(10, "hello");
Q8: 내부 컨테이너를 변경하려면 어떻게 하나요?
A8: 템플릿 인자로 세컨드 파라미터에 컨테이너 타입을 명시합니다.
Q9: iterator를 지원하나요?
A9: 아닙니다. 스택은 LIFO 전용 인터페이스만 제공하며, begin()/end() 등 iterator는 사용할 수 없습니다.
Q10: 복사·이동 생성자, 대입 연산자는 지원되나요?
A10: 내부 컨테이너가 복사/이동을 지원하면 std::stack도 기본 복사·이동 생성자와 대입 연산자를 제공합니다.
Q11: 시간 복잡도는 어떻게 되나요?
A11: push, pop, top, empty, size 연산 모두 평균 O(1) 입니다(내부 컨테이너 특성에 따름).
Q12: 스레드 안전(Thread-safety)은 어떤가요?
A12: C++ 표준 자체는 스레드 안전을 보장하지 않습니다. 다중 스레드에서 공유 시 별도 동기화(mutex 등)가 필요합니다.
Q13: 예외 안전(Exceptions Safety)은 어떻게 되나요?
A13: push/emplace 수행 중 내부 컨테이너에서 예외가 발생하면, 스택은 변경되지 않거나 내부 컨테이너의 강약결합(strong/weak) 보장에 따릅니다.
Q14: std::stack 사용 예시를 보여주세요.
A14:
include
include
using namespace std;
int main() {
stack
for (int i=1; i<=5; ++i) s.push(i);
while (!s.empty()) {
cout << s.top() << ' ';
s.pop();
}
// 출력: 5 4 3 2 1
}
Q15: 주의사항은 무엇인가요?
A15:
• iterator 미지원으로 순회 불가능
• 임의 위치의 요소 삭제·삽입 불가
• 내부 컨테이너 변경 시 성능·메모리 특성 확인 필요
Q16: std::vector나 std::deque를 직접 쓰는 것과 차이는?
A16:
• std::stack은 LIFO 전용 인터페이스로 실수로 임의 접근을 막아주고 코드 가독성이 높아짐
• 직접 컨테이너 사용 시 iterator, 임의 위치 삽입/삭제 등 더 많은 기능 사용 가능
---
위 FAQ를 통해 std::stack의 개념, 선언·사용법, 주의사항 등을 쉽게 이해하고 활용할 수 있습니다.
즉, 가장 나중에 추가된 요소가 가장 먼저 제거되는 구조입니다.
`std::stack`은 기본적으로 다른 컨테이너(예: `std::deque`, `std::vector`, `std::list`)를 기반으로 하여 동작할 수 있으며, 기본적으로 `std::deque`를 사용합니다.
기본 사용법 `std::stack`을 사용하기 위해서는 `
```cpp include
다음은 `int` 타입의 스택을 생성하는 예입니다.
```cpp std::stack
```cpp myStack.push(
10); myStack.push(20); myStack.push(30); ``` 요소 제거 스택에서 요소를 제거할 때는 `pop()` 메서드를 사용합니다.
이 메서드는 스택의 가장 위에 있는 요소를 제거합니다.
```cpp myStack.pop(); // 30이 제거됨 ``` 최상위 요소 접근 스택의 최상위 요소를 확인할 때는 `top()` 메서드를 사용합니다.
이 메서드는 스택의 가장 위에 있는 요소를 반환하지만, 제거하지는 않습니다.
```cpp std::cout << "Top element: " << myStack.top() << std::endl; // 20이 출력됨 ``` 스택의 크기 확인 스택에 현재 몇 개의 요소가 있는지 확인하려면 `size()` 메서드를 사용합니다.
```cpp std::cout << "Stack size: " << myStack.size() << std::endl; // 2가 출력됨 ``` 스택이 비어 있는지 확인 스택이 비어 있는지 확인하려면 `empty()` 메서드를 사용합니다.
이 메서드는 스택이 비어 있으면 `true`, 그렇지 않으면 `false`를 반환합니다.
```cpp if (myStack.empty()) { std::cout << "Stack is empty." << std::endl; } else { std::cout << "Stack is not empty." << std::endl; } ``` 전체 예제 아래는 `std::stack`의 기본적인 사용법을 보여주는 전체 예제입니다.
```cpp include
10); myStack.push(20); myStack.push(30); // 최상위 요소 출력 std::cout << "Top element: " << myStack.top() << std::endl; // 30 // 스택 크기 출력 std::cout << "Stack size: " << myStack.size() << std::endl; // 3 // 요소 제거 myStack.pop(); // 30 제거 // 최상위 요소 출력 std::cout << "Top element after pop: " << myStack.top() << std::endl; // 20 // 스택 크기 출력 std::cout << "Stack size after pop: " << myStack.size() << std::endl; // 2 // 스택이 비어 있는지 확인 if (myStack.empty()) { std::cout << "Stack is empty." << std::endl; } else { std::cout << "Stack is not empty." << std::endl; // 출력됨 } return 0; } ``` 주의사항 1. 예외 처리 : `top()`이나 `pop()` 메서드를 호출할 때 스택이 비어 있으면 정의되지 않은 동작이 발생할 수 있습니다.
따라서 이러한 메서드를 호출하기 전에 `empty()` 메서드로 스택이 비어 있는지 확인하는 것이 좋습니다.
2. 컨테이너의 선택 : `std::stack`은 기본적으로 `std::deque`를 사용하지만, 다른 컨테이너를 사용할 수도 있습니다.
예를 들어, `std::vector`를 사용하려면 다음과 같이 할 수 있습니다.
```cpp std::stack
3. 복사 및 이동 : `std::stack`은 복사 생성자와 이동 생성자를 지원합니다.
따라서 스택을 다른 스택으로 복사하거나 이동할 수 있습니다.
이와 같이 `std::stack`은 간단하고 직관적인 인터페이스를 제공하여 LIFO 구조를 쉽게 구현할 수 있도록 도와줍니다.
작성자:
정윤지 [비회원]
| 작성일자: 1년 전
2024-09-20 17:11:38
조회수: 154 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 154 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.