본문 바로가기
<알고리즘 문제풀이&연습>/[C++] 백준

[백준 10828] 스택 (C, C++ stack)

by 사용자 BlockDMask 2017. 8. 1.
반응형
  • 안녕하세요. BlockDMask 입니다. 

  • 오늘의 포스팅을 시작하도록하겠습니다.

  • 오늘은 기본 스택을 구현하는 문제입니다.

  • C, C++ 두가지를 이용하여 풀었습니다.

0. 제목

  • 백준 10828 스택

  • BOJ 10828 스택

1. 문제설명


정수를 저장하는 스택을 구현하는 문제입니다.


push N : 정수 N을 스택에 넣습니다.

pop : 스택의 맨 위의 정수를 빼고, 출력. 없는경우 -1 출력.

size : 스택의 정수의 개수 출력.

empty : 스택이 비어있으면 1, 아니면 0 출력.

top : 스택의 가장 위의 정수를 출력, 없는경우 -1 출력


2. 풀이과정


C++ 은 STL 에서 stack이 구현 되어있기 때문에 구현되어있는 stack을 이용하였고, 

C는 직접 구현을 했습니다.


3. 함수설명


C++의 stack 의 멤버인 empty() 의 return 값은 bool 타입으로 true, false 입니다.


C는 주석으로 처리했습니다.

주석을 길게 쓰는 것을 좋아하지 않아서. "습니다" 체를 쓰지 않았습니다.

양해 부탁드립니다.


4. 코드


T1) C로 구현했을때.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include<stdio.h>
#include<string.h>
 
#define TRUE 1            //1반환 
#define FALSE 0           //0반환 
#define MINUS -1         //-1반환 
#define MAX_SIZE 10000    //스택 배열 사이즈 
 
typedef struct _stack{    //스택 구조체. 
    int arr[MAX_SIZE];
    int top;
} Stack;
 
void StackInit(Stack * sp){    //스택 초기화 함수 
    sp->top = -1;
}
 
int IsEmpty(Stack * sp){    //스택이 비어있는지 확인 
    if(sp->top == -1return TRUE;
        
    return FALSE;
}
 
int Size(Stack *sp){    //스택의 size 반환 
    return sp->top + 1;
}
 
 
int IsFull(Stack * sp){        //스택이 꽉 차있는지 확인 
    if(sp->top + 1 >= MAX_SIZE) return TRUE;
    
    return FALSE;
}
 
void Push(Stack * sp, int data){    //스택의 push 
    if(IsFull(sp)==TRUE) return;
    
    //top을 하나 올린 후 data 삽입
    sp->arr[++(sp->top)] = data;    
}
 
int Pop(Stack * sp){    //스택의 pop. 
    if(IsEmpty(sp) == TRUE) return MINUS;
 
    //top이 가리키는 값을 반환 후 top을 하나 내림.
    return sp->arr[(sp->top)--];
}
 
int Peek(Stack *sp){    //스택의 맨위의 인자를 반환합니다. 
    if(IsEmpty(sp) == TRUE) return MINUS;
    
    return sp->arr[sp->top];
}
 
 
int main(void){
    int i;
    char str[6];
    Stack stack;
    int n, num;
    
    scanf("%d"&n);
    fgetc(stdin);    //버퍼 비우기 
    StackInit(&stack);    //stack 초기화. 
    
    
    for(i=0; i<n; i++){
    
        scanf("%s", str);
        fgetc(stdin);    //버퍼 비우기. 
 
        if(!strcmp(str, "push")){    //push 인 경우 
            
            scanf("%d"&num);
            fgetc(stdin);    //버퍼 비우기. 
            Push(&stack, num);    
            
        }else if(!strcmp(str, "pop")){    //pop인 경우 
        
            printf("%d\n", Pop(&stack));
        
        }else if(!strcmp(str, "empty")){    //empty인경우 
            
            printf("%d\n", IsEmpty(&stack));
            
        }else if(!strcmp(str, "size")){        //size인 경우  
        
            printf("%d\n", Size(&stack));
        
        }else if(!strcmp(str, "top")){        //top인 경우 
        
            printf("%d\n", Peek(&stack));
        
        }
    }
    
    
    return 0;    
}
cs


T2) C++ 로 구현했을 때.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
#include<stack>
#include<string>
 
using namespace std;
 
int main(void){
    int n;
    cin >> n;
    
    stack<int> st; //int type의 stack 선언. 
    string str;
 
    for(int i=0; i<n; i++) {
        cin >> str;
 
        if (str == "push") { //push 명령어 일때. 
 
            int num;
            cin >> num;
            st.push(num);
 
        } else if (str == "pop") {    //pop 명령어 일때. 
 
            if (!st.empty()) {
                cout << st.top() << endl;
                st.pop();
            } else {
                cout << "-1" << endl;
            }
 
        } else if (str == "size") {        //size 명령어 일때. 
 
            cout << st.size() << endl;
 
        } else if (str == "empty") {    //empty 명령어 일때. 
 
            if (st.empty()) {
                cout << "1" << endl;
            } else {
                cout << "0" << endl;
            }
 
        } else if (str == "top") {        //top 명령어 일때. 
 
            if (!st.empty()) {
                cout << st.top() << endl;
            } else {
                cout << "-1" << endl;
            }
 
        }
 
    }
    return 0;
}
cs


5. 인증


T1) C로 구현했을때.


T2) C++로 구현했을 때.


출처 : https://www.acmicpc.net/problem/10828

반응형

댓글2