본문 바로가기
프로그래밍/C 언어(정리)

C언어] 스택

by 곰나나 2024. 1. 1.

[스택]

1. 스택 이란?
스택은 후입선출(Last-In-First-Out, LIFO)의 자료구조로서, 데이터를 쌓아 올리는 방식으로 동작한다. 스택은 주로 함수 호출, 임시 데이터 저장 등 다양한 용도로 사용된다. C 언어에서는 스택을 구현하고 다루는 데 필요한 몇 가지 개념과 함수들이 있다.

스택의 구현: 스택은 배열이나 연결 리스트를 사용하여 구현될 수 있다. 배열 기반 스택은 일반적으로 크기가 정적으로 정해지지만, 연결 리스트 기반 스택은 동적으로 크기가 조절될 수 있다.

스택의 주요 연산
Push: 스택에 데이터를 추가합니다.
Pop: 스택에서 데이터를 제거합니다.
Top (또는 Peek): 스택의 맨 위에 있는 데이터를 조회합니다.
isEmpty: 스택이 비어 있는지 확인합니다.

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
100
101
102
103
104
105
106
107
108
109
110
// 스택
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_SIZE 100
 
//& 스택을 나타내는 구조체
struct Stack
{
    //& 스택의 데이터를 저장하는 배열, 스택의 맨 위 원소의 인덱스를 나타내는 변수
    int arr[MAX_SIZE]; 
    int top;           
};
 
//& 스택 초기화 함수
void initialize(struct Stack* stack)
{
    //& 스택의 초기화: 맨 위 원소의 인덱스를 -1로 설정
    stack->top = -1
}
 
//& 스택에 원소를 추가하는 함수
void push(struct Stack* stackint data)
{
    //& 스택이 가득 찬 경우
    if (stack->top == MAX_SIZE - 1
    {
        printf("스택 오버플로우!\n");
        return;
    }
    //& 스택의 맨 위에 원소를 추가하고 top을 갱신
    stack->arr[++stack->top] = data; 
}
 
//& 스택에서 원소를 제거하는 함수
int pop(struct Stack* stack)
{
    //& 스택이 비어 있는 경우
    if (stack->top == -1
    {
        printf("스택 언더플로우!\n");
        exit(1); //& 프로그램 종료
    }
    //& 스택의 맨 위 원소를 제거하고 top을 갱신
    return stack->arr[stack->top--]; 
}// pop
 
//& 스택의 맨 위 원소를 조회하는 함수
int top(struct Stack* stack)
{
    //& 스택이 비어 있는 경우
    if (stack->top == -1
    {
        printf("스택이 비어 있습니다!\n");
        exit(1); //& 프로그램 종료
    }
    //& 스택의 맨 위 원소를 반환
    return stack->arr[stack->top]; 
}// top
 
//& 스택이 비어 있는지 확인하는 함수
int isEmpty(struct Stack* stack)
{
    //& top이 -1이면 스택이 비어 있음
    return (stack->top == -1); 
}// isEmpty
 
//& 스택의 모든 원소를 출력하는 함수
void printStack(struct Stack* stack)
{
    if (isEmpty(stack))
    {
        printf("스택이 비어 있습니다.\n");
        return;
    }
 
    printf("스택 출력: ");
    for (int i = 0; i <= stack->top; ++i)
    {
        printf("%d "stack->arr[i]);
    }
    printf("\n");
}// printStack
 
int main()
{
    struct Stack myStack;
    //& 스택 초기화
    initialize(&myStack); 
 
    //& 스택에 원소 추가
    push(&myStack, 10);
    push(&myStack, 20);
    push(&myStack, 30);
    push(&myStack, 40);
    push(&myStack, 50);
    push(&myStack, 60); //& 스택 오버플로우를 발생시키기 위해 추가
 
    //& 스택 전체 출력
    printStack(&myStack);
 
    //& 맨 위 원소 출력
    printf("맨 위 원소: %d\n", top(&myStack));
 
    //& 원소 제거 후 맨 위 원소 출력
    printf("제거된 원소: %d\n"pop(&myStack));
    printf("제거 후 맨 위 원소: %d\n", top(&myStack));
 
    return 0;
}// main
cs

728x90

'프로그래밍 > C 언어(정리)' 카테고리의 다른 글

C언어] 트리  (0) 2024.01.02
C언어] 큐  (0) 2024.01.02
C언어] 이중 연결 리스트  (1) 2024.01.01
C언어] 단순 연결 리스트  (0) 2023.12.30
C언어] 동적 배열  (1) 2023.12.30