일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ubuntu
- AI
- Java
- flower classification
- drone control
- deep learning
- 긍부정문 판별
- docker
- docker in ubuntu
- ubuntu에서 docker 사용
- 360게임 만들기 with c
- 오목게임앱
- pill ai
- yolo mask
- 한글깨짐해결
- dji tello
- C
- 오목앱 만들기
- 시저암호 코딩
- token check
- mask image training
- iris dataset
- Python
- 369게임 만들기
- pill classification
- 춤 유사도 평가
- aws code pipeline
- ceasor
- docker container
- Container
- Today
- Total
월레스와 그로밋: 코딩의 날
스택(stack) 본문
스택(stack)이란?
스택은 후입선출(Last In First Out)로 동작한다.
가장 마지막에 들어간 데이터가 가장 먼저 빠져나간다는 뜻이다.
스택이 실생활에 사용되는 예
제일 마지막에 작성한 코드부터 차례대로 되돌아가기 위해 우리는 Ctrl + z 키를 사용한다.
물건을 밑에서부터 차근차근 쌓아 올리고 계산할때는 맨 위, 즉, 제일 마지막에 올려서 위에 놓인 물건부터 계산대로 옮긴다.
컴퓨터는 사람처럼 계산을 할 수 없기 때문에 후위 표기법과 같이 계산한다.
쨌든 맨 처음 넣었던 데이터를 확인하려면 그 위에 쌓여있는 다른 데이터들을 꺼내야 확인할 수 있다.
스택의 구성
스택 구현
1
2
3
4
|
typedef struct Stack {
int arr[100];
int top;
}stack;
|
cs |
스택의 구조체 부분에는 100칸짜리 int형 배열과 맨 위에 있는 데이터를 저장할 수 있는 변수가 구성 되어있다.
1
2
3
4
|
void init(stack* s)
{
s->top = -1;
}
|
cs |
스택을 만들때마다 초기화 시켜주는 함수이다.
배열은 인덱스 0부터 시작하니, top 변수에 -1을 넣어 초기화시켜줘서 스택이 비어있음을 말한다.
1
2
3
4
5
6
|
int is_empty(stack* s)
{
if (s->top == -1)
return 1;
return 0;
}
|
cs |
스택이 비어있는지 확인하는 함수이다.
만약 top 변수에 -1이 들어가있으면 스택이 비었다는 뜻이므로 1('참')을 반환하고
비어있지 않으면 0('거짓')을 반환한다.
1
2
3
4
5
6
|
int is_full(stack* s)
{
if (s->top == 99)
return 1;
return 0;
}
|
cs |
스택이 가득 차있는지 확인하는 함수이다.
배열의 맨 끝 인덱스가 99이므로 top변수의 값이 99이면 1을 반환하고
그렇지 않다면 아직 가득 차지 않았으므로 0을 반환한다.
1
2
3
4
5
6
7
8
9
|
void push(stack* s, int data)
{
if (is_full(s)) {
printf("\nStack is full.\n");
exit(1);
}
printf("pushed: %d\n", data);;
s->arr[++(s->top)] = data;
}
|
cs |
데이터를 넣는 함수이다.
만약 스택이 가득 찼을 시 is_full 함수에서 1을 반환하여 스택이 가득 찼다는 문구를 남긴 뒤 시스템을 종료한다.
스택이 가득 차지 않았으면 push된 데이터를 출력한뒤 arr배열 현재 인덱스의 다음 인덱스에 데이터를 넣는다.
data = 1 일때, 현재 스택이 비어있다면 top = -1 이고, pushed : 1을 출력한다음 '++' 연산자가 앞에 놓여있으므로 배열의 인덱스가 0일때 data(1)를 넣는다.
1
2
3
4
5
6
7
8
|
int pop(stack* s)
{
if (is_empty(s)) {
printf("\nStack is empty.\n");
exit(1);
}
return s->arr[(s->top)--];
}
|
cs |
데이터를 빠져나오게 하는 함수이다.
만약 빼낼 데이터가 없는 스택이 비어있는 상태일 때 is_empty함수에서 1을 반환하여 스택이 비었다는 문구를 남긴뒤 시스템을 종료한다.
아직 빼낼 데이터가 있다면 top에 위치한 데이터를 반환시켜주고난 후 top이 있던 인덱스가 한칸 빠지기 때문에 '--'를 후에 해준다.
1
2
3
4
5
6
7
8
|
int peek(stack* s)
{
if (is_empty(s)) {
printf("Stack is empty.\n");
exit(1);
}
return s->arr[(s->top)];
}
|
cs |
현재 top에 있는 데이터를 알려주는 함수이다.
스택이 비어있을시에는 pop함수와 마찬가지로 스택이 비어있음을 알린뒤 시스템을 종료한다.
비어있지 않다면 현재 스택의 맨 끝(위, top)에 위치한 데이터를 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
int main()
{
stack s;
init(&s); // stack
push(&s, 3);
push(&s, 2);
push(&s, 1);
printf("\ntop check : %d\n\n", peek(&s));
printf("pop : %d\n", pop(&s));
printf("pop : %d\n", pop(&s));
printf("pop : %d\n", pop(&s));
printf("\npop : %d\n", pop(&s)); // empty
return 0;
}
|
cs |
스택에 데이터를 3, 2, 1 순으로 집어넣은 뒤 top에 있는 데이터가 무엇인지 확인한다. 그리고 pop함수를 이용해서 맨 나중에 들어간 데이터부터 빼내며 출력한다.
마지막에는 모든 데이터가 다 빠져나가서 스택이 비어있으니 스택이 비어있다고 알린 후 시스템을 종료한다.
결과♬
'Etc > C' 카테고리의 다른 글
rsp_game(묵찌빠 게임) (0) | 2025.01.26 |
---|---|
hourglass(모래시계) (0) | 2025.01.26 |
369 (0) | 2025.01.26 |
이중연결리스트 사용 예시 (대기자명단) (0) | 2023.07.27 |
노드(Node) (0) | 2023.07.26 |