동적 배열 스택 구현하기

2023. 1. 23. 14:52·자료구조(Data Structure)

앞에서는 스택의 크기를 고정시켜놓고 컴파일을 하는 1차원 배열 스택을 구현했다.

이번에는 필요에따라 메모리 공간을 할당하는 동적메모리를 활용한 스택을 구현해보자.


#include <stdio.h>
#include <stdlib.h>

typedef int element;
typedef struct {
    int top;
    int capacity;
    element *data;
} StackType;

일반적인 스택구현과 다른점은 element *data이다.

동적메모리를 할당할 malloc함수는 리턴값이 포인터이기 때문에,

그 포인터를 받을 포인터변수 data를 선언한다.


1.스택초기화, 동적메모리 free

void init_stack(StackType *s)
{
    s->top = -1;
    s->capacity = 1;
    s->data = (element *)malloc(s->capacity * sizeof(element));
}

스택초기화 함수이다.

capacity변수와 메모리할당 부분이 중요한데,

capacity는 메모리할당량을 어느정도 할 건지에 관여한다.

메모리할당하는 부분을 보자.

element형 메모리를 element크기 X capacity만큼 할당한다.

나중에 capacity가 2라면 element크기의 공간을 2배 할당한다는 뜻이다.

첫번째는 일단 capacity가 1인데, 공간을 1칸 할당한다.

 

 

 

void delete_stack(StackType *s)
{
    free(s->data);
}

할당했다면, 나중에 메모리를 해제해 줘야 할 것이다.


2.push함수의 변화

가장 큰 변화가 있는 부분은 push 함수일 것이다.

스택에 데이터를 넣어야 할 때, 메모리 공간이 있는지? 부족하다면 메모리를 늘려줘야 하기 때문이다.

void push(StackType *s, element item)
{
    if(is_full(s) == 1){
        printf("메모리 부족해서 늘립니다.\n");
        s->capacity *= 2;
        s->data = (element *) realloc(s->data, s->capacity * sizeof(element));
    }
    s->data[++(s->top)] = item;
}

만약, 데이터를 넣을때 스택이 꽉 찼다면 capacity를 2배 해주고,

realloc으로 기존메모리의 2배를 재할당 해준다.

그리고 데이터를 메모리에 넣으면 된다.

주의!) else문을 추가해서 s->data[++(s->top)] = item을 하면 안된다.

이렇게하면 메모리가 부족할 때, 재할당만 하고 데이터를 스택에 넣지 못하기 때문이다.(내가 실수했던 부분)


동적 배열 스택으로 구현했을 때, 다른 점만 써봤고

나머지는 앞에서 한 구현과 동일하다.

 

전체적인 코드를 보고, 실행해보자.

#include <stdio.h>
#include <stdlib.h>

typedef int element;
typedef struct {
    int top;
    int capacity;
    element *data;
} StackType;

void init_stack(StackType *s)
{
    s->top = -1;
    s->capacity = 1;
    s->data = (element *)malloc(s->capacity * sizeof(element));
}

void delete_stack(StackType *s)
{
    free(s->data);
}

int is_empty(StackType *s)
{
    if(s->top == -1)
        return 1;
    else
        return 0;
}

int is_full(StackType *s)
{
    if(s->top == (s->capacity - 1))
        return 1;
    else
        return 0;
}

void push(StackType *s, element item)
{
    if(is_full(s) == 1){
        printf("메모리 부족해서 늘립니다.\n");
        s->capacity *= 2;
        s->data = (element *) realloc(s->data, s->capacity * sizeof(element));
    }
    s->data[++(s->top)] = item;
}

int pop(StackType *s)
{
    if(is_empty(s) == 1){
        printf("empty\n");
    }
    else
        return s->data[(s->top)--];
}

int main(void)
{
    StackType s; //구조체 변수 선언
    init_stack(&s); //스택 초기화

    push(&s, 1);
    push(&s, 2); //메모리 부족
    push(&s, 3); //메모리 부족
	free(s.data);

    return 0;
}

 

실행결과)


과정 살펴보기

 

'자료구조(Data Structure)' 카테고리의 다른 글

C언어로 덱(Deque) 구현하기  (2) 2023.01.31
원형큐 구현하기  (2) 2023.01.25
C언어로 큐(Queue) 구현하기  (0) 2023.01.23
C언어로 스택(Stack) 구현하기  (0) 2023.01.21
순환 - 팩토리얼, 거듭제곱값, 피보나치 수열, 하노이 탑  (0) 2023.01.14
'자료구조(Data Structure)' 카테고리의 다른 글
  • 원형큐 구현하기
  • C언어로 큐(Queue) 구현하기
  • C언어로 스택(Stack) 구현하기
  • 순환 - 팩토리얼, 거듭제곱값, 피보나치 수열, 하노이 탑
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    rubikpi3
    Git
    yolo
    파일 입출력
    동적메모리
    C++
    커널 기여
    arm
    커널
    토발즈
    버퍼
    자료구조
    리눅스
    시스템콜
    이진 트리
    소수
    commit
    파이썬
    피보나치
    드라이버 분석
    c언어
    앤드류모튼
    INIT
    순환
    rubik pi
    스택
    Qualcomm
    Branch
    포인터
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
동적 배열 스택 구현하기
상단으로

티스토리툴바