티스토리 뷰
>문제
> 핵심
스택
>풀이과정
그냥 스택 문제다.
자료구조 시간때 스택을 배운 사람들이라면 이런 코드는 수업시간때 한번쯤은 짜봤지 않을까 하는 생각이 든다. ㅋㅋㅋ
그래도 이 기회에 스택에 대해 개념을 확실히 다져놓고 넘어가자.
일단 C언어에서 False = 0, True = 0이 아닌 모든것(1) 이라는거 제발 좀 까먹지 말자.. 왜자꾸 까먹는지..
· 스택 구조체 선언 및 초기화
#define SIZE 10001
typedef struct
{
int stack[SIZE];
int n;
}StackType;
void init_stack(StackType* s)
{
s->n = -1;
}
스택 구조체 StackType를 만들고, s->n=-1로 초기화 하여 첫 값이 0번째 인덱스에 들어가도록 세팅
· 스택이 가득 찼는지? / 텅 비었는지?
int is_full(StackType* s)
{
return (s->n == SIZE - 1);
}
int is_empty(StackType* s)
{
return (s->n == -1);
}
스택이 가득 찼는지 보는 is_full 함수.
s->n 이 SIZE-1. 그니까 stack 배열의 끝까지 갔다면 (True, 1) 그게 아니라면 (False, 0) 을 return한다.
스택이 비었는지 확인하는 is_empty 함수.
초기화 했을때와 같이 s->n == -1 이면 비었다고 확인하고 결과값 return.
· Push
void push(StackType* s, int e)
{
if (is_full(s))
return;
s->stack[++s->n] = e;
}
스택이 꽉 찼나요?
아니면 s.n을 하나 증가시킨 다음에 stack 배열에 값 넣기.
· Pop
int pop(StackType* s)
{
if (is_empty(s))
return -1;
int e = s->stack[s->n--];
return e;
}
스택이 비었나요? 그럼 return -1
아니면 현재 stack 인덱스의 값을 e 에 넣어놓고 s->n--. 그 이후에 e를 return.
· 현재 스택의 사이즈는?
int size(StackType* s)
{
return s->n + 1;
}
s->n 이 -1부터 시작하니까. +1 해줘서 return 함.
· 스택에 꼭대기에는?
int top(StackType* s)
{
if (is_empty(s))
return -1;
return s->stack[s->n];
}
스택이 비었나요? 그럼 return -1.
아니면 제일 꼭대기에 있는 값 return.
>깨달은점
스택은 어렵지 않다 :D
>코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define SIZE 10001
typedef struct
{
int stack[SIZE];
int n;
}StackType;
void init_stack(StackType* s)
{
s->n = -1;
}
int is_full(StackType* s)
{
return (s->n == SIZE - 1);
}
int is_empty(StackType* s)
{
return (s->n == -1);
}
void push(StackType* s, int e)
{
if (is_full(s))
return;
s->stack[++s->n] = e;
}
int pop(StackType* s)
{
if (is_empty(s))
return -1;
int e = s->stack[s->n--];
return e;
}
int top(StackType* s)
{
if (is_empty(s))
return -1;
return s->stack[s->n];
}
int size(StackType* s)
{
return s->n + 1;
}
int main()
{
StackType s; init_stack(&s);
char op[6];
int i, n, e;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf(" %s", op);
if (strcmp(op, "push") == 0)
{
scanf(" %d", &e);
push(&s, e);
}
else if (strcmp(op, "pop") == 0)
{
e = pop(&s);
printf("%d\n", e);
}
else if (strcmp(op, "top") == 0)
{
e = top(&s);
printf("%d\n", e);
}
else if (strcmp(op, "empty") == 0)
{
e = is_empty(&s);
printf("%d\n", e);
}
else if (strcmp(op, "size") == 0)
{
e = size(&s);
printf("%d\n", e);
}
}
return 0;
}
'알고리즘 > 기타' 카테고리의 다른 글
[C] 백준 | 10866번 코드 - 덱 (0) | 2021.03.01 |
---|---|
[C] 백준 | 10845번 코드 - 큐 (0) | 2021.03.01 |
[C] 백준 | 10816번 코드 - 숫자 카드 2 (0) | 2021.03.01 |
[C] 백준 | 10773번 코드 - 제로 (0) | 2021.02.28 |
[C] 백준 | 9012번 코드 - 괄호 (0) | 2021.02.28 |
댓글