스택(Stack)은 데이터의 삽입과 삭제가 정해진 순서에 따라 수행되는 선형(linear) 자료구조입니다. 이 순서는 LIFO(Last In First Out, 후입선출) 또는 FILO(First In Last Out, 선입후출) 방식으로 설명되며, 쉽게 말해 가장 나중에 들어간 데이터가 가장 먼저 꺼내지는 구조입니다.
STL stack의 주요 멤버 함수
C++ 표준 라이브러리(STL)의 stack 컨테이너 어댑터는 다음과 같은 핵심 멤버 함수를 제공합니다.
s.size(): 스택에 저장된 요소의 개수를 반환합니다.s.push(x): 스택의 맨 위에 요소 x를 삽입합니다.s.pop(): 스택의 맨 위 요소를 제거합니다. (반환값 없음)s.top(): 스택 최상단 요소에 대한 참조를 반환합니다.s.empty(): 스택이 비어 있으면 true를 반환합니다.
알고리즘
시작
스택(stack) 컨테이너를 선언한다.
사용자의 선택에 따라 입력을 받는다.
switch 문 안에서 아래 함수들을 호출한다:
s.size() → 스택의 크기를 반환한다.
s.push() → 스택에 요소를 삽입한다.
s.pop() → 스택에서 값을 꺼내 제거한다.
s.top() → 스택 최상단 요소의 참조를 반환한다.
끝.
예제 코드
아래 예제는 메뉴 기반으로 스택의 삽입, 삭제, 크기 확인, 최상단 요소 조회를 수행하는 콘솔 프로그램입니다.
#include <iostream>
#include <stack>
#include <cstdlib>
using namespace std;
int main() {
stack<int> s;
int c, i;
while (1) {
cout<<"1.스택 크기 확인"<<endl;
cout<<"2.스택에 요소 삽입"<<endl;
cout<<"3.스택에서 요소 삭제"<<endl;
cout<<"4.스택의 최상단 요소 확인"<<endl;
cout<<"5.종료"<<endl;
cout<<"메뉴를 선택하세요: ";
cin>>c;
switch(c) {
case 1:
cout<<"스택의 크기: "<<s.size()<<endl;
break;
case 2:
cout<<"삽입할 값을 입력하세요: ";
cin>>i;
s.push(i);
break;
case 3:
if (!s.empty()) {
i = s.top(); // pop()은 값을 반환하지 않으므로 top()으로 먼저 확인
s.pop();
cout<<i<<" 삭제됨"<<endl;
} else {
cout<<"스택이 비어 있습니다."<<endl;
}
break;
case 4:
if (!s.empty()) {
cout<<"스택의 최상단 요소: "<<s.top()<<endl;
} else {
cout<<"스택이 비어 있습니다."<<endl;
}
break;
case 5:
exit(1);
default:
cout<<"잘못된 선택입니다."<<endl;
}
}
return 0;
}
실행 결과
1.스택 크기 확인 2.스택에 요소 삽입 3.스택에서 요소 삭제 4.스택의 최상단 요소 확인 5.종료 메뉴를 선택하세요: 1 스택의 크기: 0 ...(이하 메뉴 반복)... 메뉴를 선택하세요: 2 삽입할 값을 입력하세요: 1 메뉴를 선택하세요: 2 삽입할 값을 입력하세요: 7 메뉴를 선택하세요: 2 삽입할 값을 입력하세요: 6 메뉴를 선택하세요: 2 삽입할 값을 입력하세요: 10 메뉴를 선택하세요: 2 삽입할 값을 입력하세요: 4 메뉴를 선택하세요: 1 스택의 크기: 5 메뉴를 선택하세요: 3 4 삭제됨 메뉴를 선택하세요: 4 스택의 최상단 요소: 10 메뉴를 선택하세요: 5 Exit code: 1
핵심 포인트
pop()은 단순히 요소를 제거만 하고 값을 반환하지 않으므로, 삭제되는 값을 확인하려면top()을 먼저 호출해야 합니다.- 빈 스택에 대해
top()이나pop()을 호출하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있으므로, 반드시empty()로 검사한 뒤 사용하는 것이 안전합니다. - 프로그램은
exit(1)로 종료되며, 이 경우 운영체제에 종료 코드 1이 반환됩니다.