백준 10828번 : 스택
문제
풀이
STL 이용한 풀이
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main(){
stack<int> st;
int N;
int p;
string input;
cin>>N;
for(int i; i<N; i++){
cin>>input;
if(input == "push"){
cin>>p;
st.push(p);
}
else if(input == "pop"){
if(st.empty()){
cout<<"-1"<<endl;
}else{
cout<<st.top()<<endl;
st.pop();
}
}
else if(input == "size"){
cout<<st.size()<<endl;
}
else if(input == "empty"){
if(st.empty()){
cout<<"1"<<endl;
}else{
cout<<"0"<<endl;
}
}
else if(input == "top"){
if(st.empty()){
cout<<"-1"<<endl;
}else{
cout<<st.top()<<endl;
}
}
}
return 0;
스택을 직접 구현한 풀이
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
const int MAX_STACK_SIZE=10000;
class ArrayStack{
int T;
int array[MAX_STACK_SIZE];
public:
ArrayStack(){T =-1;}
~ArrayStack(){}
void push(int N){
if(T != MAX_STACK_SIZE-1){
T++;
array[T] = N;
}
}
void pop(){
if(T == -1){
printf("-1\n");
}else{
printf("%d\n",array[T--]);
}
}
void size(){
printf("%d\n",T+1);
}
void empty(){
if( T == -1 ){printf("1\n");}
else{printf("0\n");}
}
void top(){
if( T == -1 ){printf("-1\n");}
else{
printf("%d\n",array[T]);}
}
};
int main(){
int N;//명령의 수
string input;//명령어
int p; //push할 때 넣는 숫자
ArrayStack stack;
cin>>N;
for(int i=0;i<N;i++){
cin >> input;
if(input == "push"){
cin>>p;
stack.push(p);
}
else if(input == "pop"){
stack.pop();
}
else if(input == "size"){
stack.size();
}
else if(input == "empty"){
stack.empty();
}
else if(input == "top"){
stack.top();
}
}
return 0;
}
처음에 예제 문제는 정답으로 출력이 되는데 왜 틀렸는지 이유를 몰랐었다.
틀린 이유는 주어진 명령의 수가 1<=N<=10000 이면 최악의 경우를 고려해 스택 사이즈를 10000으로 만들어야 하는데 그 생각을 못하고 임의로 스택 사이즈를 20으로 고정시켜서 틀린것이었다.
다음에는 조건을 더 유심히 보고 예제뿐만 아니라 여러 상황을 고려해서 코드를 짜야겠다.
참고) STL Stack 기본 사용법
- 스택 헤더 파일
stack STL을 사용하기 위해서는 #include < stack > 헤더파일을 포함해야 한다.
stack < 데이터 타입 > 이름; 으로 스택을 선언한다.
#include <stack>
stack<int> stack;
- 스택에 데이터 추가하기
스택이름.push(데이터) 형태로 데이터를 추가한다.
stack.push(element)
- 스택에 데이터 삭제하기
스택이름.pop(데이터) 형태로 스택의 top 데이터를 삭제한다.
stack.pop()
- 스택의 제일 위(탑, top) 데이터 반환
스택이름.top() 형태로 제일 최상위 데이터를 반환한다.
stack.top()
- 스택의 사이즈 반환
스택이름. size() 형태로 스택의 현재 사이즈를 반환한다.
stack.size()
- 스택이 비어있는 지 확인
스택이름.empty() 형태로 스택이 비어있는지 확인한다.
stack.empty()
- 스택 SWAP : 두 스택의 내용 바꾸기
스택1과 스택2 두 스택의 내용을 바꾸고 싶은 경우, 내장된 swap 함수를 사용한다.
swap(스택1 이름, 스택2 이름) 형태로 두 스택의 내용을 바꾼다.
swap(stack1 , stack2)
Leave a comment