[자료구조] Stack (feat. C 언어)
2023. 7. 19. 08:59ㆍCS/자료구조
정의
스택(stack)은 자료 구조 중 선형 구조에 해당되며 한쪽 끝에서 자료의 삽입, 삭제가 모두 일어나는 후입선출(LIFO : Last In Fisrt Out) 방식으로 이루어져 있다. 자료를 삽입할 때는 push라고 하며 반대로 삭제할 때는 pop이라고 한다.
특징
- 선형 구조
- 후입선출(LIFO : Last In Fisrt Out)
- 삽입 - push, 삭제 - pop
- 함수 호출의 순서 제어, 인터럽트의 처리, 수식 계산 및 수식 표기법 등
연산
- push 연산 : 스택이 비어있는 경우 추가되는 데이터는 바로 top이 되며 포인터는 null값을 가진다. 스택에 데이터가 추가될 때 추가되는 노드가 가리키는 포인터는 현 스택 top의 주소이며 이후 top은 자기 자신이 된다.
- pop 연산 : 데이터를 삭제 할 시 삭제되는 노드가 가리키는 주소의 노드가 top이 되며 삭제되는 노드는 free 함수를 통해 메모리를 해제한다.
구현
- init_stack 함수 : 스택 초기화
1
2
3
4
5
|
void init_stack(struct Stack* stack) // stack 이니셜라이징
{
stack->top = NULL;
}
|
cs |
- push 함수 : 스택에 데이터 삽입
1
2
3
4
5
6
7
8
9
10
11
12
|
void push(struct Stack* stack, int data) // data를 stack에 넣어주는 함수, 이 때 주체는 top
{
struct Node_stack* node = (struct Node_stack*)malloc(sizeof(struct Node_stack));
if (stack->top != NULL) // stack에 data가 있는 경우
{
node->next = stack->top;
}
node->data = data;
stack->top = node;
}
|
cs |
- pop 함수 : 스택에서 데이터 삭제 후 데이터 값 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int pop(struct Stack* stack) // data를 stack에서 제거해주는 함수, data는 LIFO 형식(Last In First Out) : 맨 나중에 들어온 data가 맨 첫번째로 제거 된다.
{
if (stack->top == NULL) // stack이 비어있는 경우
{
printf("남은 data가 없습니다.\n");
return 0;
}
struct Node_stack* node = stack->top;
int data = node->data;
stack->top = node->next;
free(node);
return data;
}
|
cs |
- get_top : 스택의 top 위치에 있는 데이터 값 반환
1
2
3
4
5
|
int get_top(struct Stack* stack) // top에 위치해있는 data 얻는 함수
{
struct Node_stack* node = stack->top;
return node->data;
}
|
cs |
- 전체 구조
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
|
struct Node_stack {
int data;
struct Node_stack* next;
};
struct Stack {
struct Node_stack* top;
};
void push(struct Stack* stack, int data);
int pop(struct Stack* stack);
int get_top(struct Stack* stack);
void init_stack(struct Stack* stack);
void init_stack(struct Stack* stack) // stack 이니셜라이징
{
stack->top = NULL;
}
void push(struct Stack* stack, int data) // data를 stack에 넣어주는 함수, 이 때 주체는 top
{
struct Node_stack* node = (struct Node*)malloc(sizeof(struct Node_stack));
node->data = data;
node->next = stack->top;
stack->top = node;
}
int pop(struct Stack* stack) // data를 stack에서 제거해주는 함수, data는 LIFO 형식(Last In First Out) : 맨 나중에 들어온 data가 맨 첫번째로 제거 된다.
{
if (stack->top == NULL) // stack이 비어있는 경우
{
printf("남은 data가 없습니다.\n");
return 0;
}
struct Node_stack* node = stack->top;
int data = node->data;
stack->top = node->next;
free(node);
return data;
}
int get_top(struct Stack* stack) // top에 위치해있는 data 얻는 함수
{
struct Node_stack* node = stack->top;
return node->data;
}
|
cs |
'CS > 자료구조' 카테고리의 다른 글
[자료구조] Hash Table (해시 테이블) (0) | 2023.07.24 |
---|---|
[자료구조] 배열(Array) vs 연결 리스트(Linked List) (0) | 2023.07.20 |
[자료구조] Linked List (연결 리스트) (feat. C 언어) (0) | 2023.07.19 |
[자료구조] Queue - Josephus problem (feat. C 언어) (0) | 2023.07.19 |
[자료구조] Queue (feat. C 언어) (0) | 2023.07.19 |