[스택]
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* stack, int 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 |