stack을 구현하라는 문제인데 C++은 STL에서 stack이 구현되어있다. 그래서 그냥 구현되어있는 stack을 이용하겠다. 그전에 내용을 간단히 정리하자.
<스택이란?>
스택(stack)은 LIFO(Last In First Out)의 자료구조이다. 제일 마지막에 넣은 데이터가 처음으로 나오는 알고리즘으로 기본적으로 push와 pop 으로 동작한다. 이때 push는 stack의 최상단에 자료를 넣고, pop은 stack의 최상단 자료를 추출한다.
<스택 헤더 파일>
stack STL을 사용하기 위해 #include <stack> 헤더파일을 포함해야 한다. 이후 " stack<데이터타입> 스택명; " 으로 stack을 선언한다.
<스택 기본 함수>
1. 데이터 추가 : 스택명.push(넣을 데이터) 형태로 데이터를 추가한다.
stack.push(data);
2. 데이터 삭제 : 스택명.pop(뺄 데이터) 형태로 최상위 데이터를 삭제한다.
stack.pop();
3. 최상위 데이터 반환 : 스택명.top() 형태로 최상위 데이터를 반환한다.
stack.top();
4. 스택 사이즈 반환 : 스택명.size() 형태로 스택의 현재 사이즈를 반환한다.
stack.size();
5. 스택이 비어있는 지 확인 : 스택명.empty() 형태로 스택이 비어있는 지 확인한다. 비어있을 경우 true, 그렇지 않으면 false를 반환한다.
stack.empty();
6. 두 스택의 내용 바꾸기 : 스택명1.swap(스택명2) 형태로 두 스택의 내용을 바꾼다.
stack1.swap(stack2);
<코드>
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{
int n;
cin >> n;
stack<int> stk;
string str;
if(n<1 || n>10000)
return 0;
for(int i=0; i<n; i++){
cin >> str;
if(str == "push") {
int num=0;
cin >> num;
stk.push(num);
} else if(str == "pop"){
if(stk.empty()){
cout << "-1" << endl;
} else {
cout << stk.top() << endl;
stk.pop();
}
} else if(str == "size"){
cout << stk.size() <<endl;
} else if(str == "empty"){
if(stk.empty()){
cout << "1" << endl;
} else {
cout << "0" << endl;
}
} else if(str == "top"){
if(stk.empty()){
cout << "-1" << endl;
} else {
cout << stk.top() << endl;
}
}
}
return 0;
}
C++을 사용하면 위와 같이 간단하게 해견되지만 C로 구현 시 stack을 구조체로 정의하고 모든 동작을 메소드로 구현해야한다. 그런면에서 C++이 편리하지만 스택의 동작 자체를 자세히 이해하기 위해서 C로 직접 구현해보는 것도 좋을 것 같다.
'코테 준비 > Baekjoon Algorithm' 카테고리의 다른 글
[Day05 - 이론] 버블 정렬 & 선택 정렬 (0) | 2024.02.13 |
---|---|
[이론] 트리 (1) | 2023.12.30 |
[백준(BOJ)] 2750번 C++ 풀이 (0) | 2021.11.24 |
[백준(BOJ)] 2447번 C++ 풀이 (0) | 2021.08.03 |
[백준(BOJ)] 10872번&10870번 C++ 풀이 (0) | 2021.08.02 |