Programming/백준 (c++)
[백준] #10828: 스택
마이구미포포
2022. 9. 11. 14:55
https://www.acmicpc.net/problem/10828
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
예제 입력 1
14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top
예제 출력 1
2
2
0
2
1
-1
0
1
-1
0
3
이 문제는 스택을 구현하는 문제로, 라이브러리를 사용한 버전과 사용하지 않은 버전 두가지로 모두 문제를 풀어보았다
라이브러리 사용
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int SIZE = 1e4; //스택 사이즈 (10^4)
vector<int> stack_vec(SIZE);
int top_pointer=-1; //스택의 현재 위치 가리키는 포인터
int main()
{
int n,x;
string cmd; //명령
stack<int> st;
//입력
cin>>n;
while(n--){
cin>>cmd;
if(cmd=="push"){
cin>>x;
//런타임 에러 방지하기 위해, 스택이 꽉 찼는지 검사
// if(!full()){ //라이브러리 사용시엔 필요 x
st.push(x);
//}
continue;
}
if(cmd=="pop"){
if(st.empty()){
cout<<"-1\n";
}
else{
cout<<st.top()<<"\n";
st.pop();
}
continue;
}
if(cmd=="size"){
cout<<st.size()<<"\n";
continue;
}
if(cmd=="empty"){
cout<<st.empty()<<"\n";
continue;
}
if(cmd=="top"){
if(st.empty()){
cout<<"-1\n";
}
else{
cout<<st.top()<<"\n";
}
}
}
}
라이브러리를 이용하려면 <stack> 헤더파일을 서주고 <vector>를 선언하듯이 스택 선언을 해주면 된다
라이브러리 사용 x (함수 직접 구현)
#include <iostream>
#include <vector>
using namespace std;
const int SIZE = 1e4; //스택 사이즈 (10^4)
vector<int> stack_vec(SIZE);
int top_pointer=-1; //스택의 현재 위치 가리키는 포인터
//스택이 비어있는지 안비어있는지 확인
bool full(){
return top_pointer==(SIZE-1);
}
//push : 삽입
void push(int x){
stack_vec[++top_pointer]=x;
}
//pop : 가장 위의 값 삭제
void pop(){
top_pointer--;
}
//size : 스택 사이즈 반환
int size(){
return top_pointer+1;
}
//empty : 비어있으면 1, 아니면 0
bool empty(){
return top_pointer==-1;
}
//top : 가장 위에 있는 원소 반환 (삭제x)
int top(){
return stack_vec[top_pointer];
}
int main()
{
int n,x;
string cmd; //명령
//입력
cin>>n;
while(n--){
cin>>cmd;
if(cmd=="push"){
cin>>x;
//런타임 에러 방지하기 위해, 스택이 꽉 찼는지 검사
if(!full()){
push(x);
}
}
if(cmd=="pop"){
if(empty()){
cout<<"-1\n";
}
else{
cout<<top()<<"\n";
pop();
}
continue;
}
if(cmd=="size"){
cout<<size()<<"\n";
continue;
}
if(cmd=="empty"){
cout<<empty()<<"\n";
continue;
}
if(cmd=="top"){
if(empty()){
cout<<"-1\n";
}
else{
cout<<top()<<"\n";
}
}
}
}
라이브러리를 사용하면 위에 직접 구현한 함수들을 굳이 구현하지 않고 바로 사용할 수 있다
문제를 풀다보면 스택을 사용할 일이 정말 많기 때문에 사용하기 편리하게 라이브러리를 이용하자