[자료구조] c언어 구조체로 스택 구현하기

profile image pIutos 2022. 10. 26. 15:50

스택(Stack)이란?

스택은 데이터를 후입선출(LIFO:Last-In First-Out)하는 자료구조로, 가장 최근에 들어온 데이터가 가장 먼저 나간다는 특징이 있다.

상자나 책을 쌓아놓은 더미를 생각하면 이해하기 쉬울 것이다. 이번 글에서는 스택을 배열 구조체를 이용해서 구현해 볼 것이다.

스택 타입 구조체 정의 및 초기화 함수

#include <stdio.h>
#define SIZE 100

typedef int element; // 배열안에 들어오는 값의 타입을 element로 한번에 지정

typedef struct {
  element data[SIZE];
  int top; // Index 번호
} StackType;

// 초기화
void init(StackType *S)
{
  S -> top = -1; // 포인터 연산자로 top에 접근해서 -1로 초기화
}

스택의 요소에 해당하는 data 배열과, 스택의 index 번호에 해당하는 top을 포함하는 StackType 구조체를 선언한다.

에러체크함수 is_full(), is_empty()

  • is_full함수는 스택이 공백상태인지 아닌지를 검사한다.
  • is_empty함수는 스택이 포화상태인지 아닌지를 검사한다.
// 에러 체크 함수
int is_full(StackType *S)
{
  return S->top == SIZE - 1;
}

int is_empty(StackType *S)
{
  return S->top == -1;
}

삽입함수 push()

push함수는 스택에 데이터를 추가한다. 만약 스택이 가득 차있다면 더이상 넣을 공간이 없으므로 가득 차있다는 문구를 출력한다.

// 삽입
void push(StackType *S, element e)
{
  if (isFull(S))
    printf("Overflow\n");
  else
  {
    S->top++;              // top을 하나 증가시킨후
    S->data[S->top] = e;   // 데이터를 삽입한다
  }
}

삭제함수 pop()

pop함수는 스택에서 데이터를 삭제하고, 그 데이터를 반환한다. 만약 스택이 비어있는 상태라면 동작하지않고 비어있다는 문구를 출력한다.

// 삭제
element pop(StackType *S)
{
  if (is_empty(S))
  {
    printf("Empty\n");
    return -1;
  }
  else
  {
    element e = S->data[S->top]; // 가장 상위에 있는 데이터를 e에 저장한 후
    S->top--;                    // top을 하나 감소시킨다
    return e;
  }
}

조회함수 peek()

peek함수는 스택에서 데이터를 삭제하지 않고 들여다 보기만 하는 함수이다. pop과 마찬가지로 스택의 비어있음을 체크한다.

// 조회
element peek(StackType *S)
{
  if (is_empty(S))
  {
    printf("Empty\n");
    return -1;
  }
  else
  {
    return S->data[S->top];
  }
}

스택 출력 함수 print()

print함수를 만들어 스택을 처음부터(0) 끝까지(top) 차례로 출력함으로써 확인할 수 있다.

void print(StackType *S)
{
  for (int i = 0; i <= S->top; i++)
  {
    printf("%c ", S->data[i]);
  }
  printf("\n");
}

전체 코드

스택을 구현한 전체 코드는 아래와 같다. (더보기)

더보기
#include <stdio.h>
#define SIZE 100

typedef int element;

typedef struct
{
  element data[SIZE];
  int top; 
} StackType;

// 초기화
void init(StackType *S)
{
  S->top = -1;
}

// 에러 체크 함수
int is_empty(StackType *S)
{
  return S->top == -1;
}

int is_full(StackType *S)
{
  return S->top == SIZE - 1;
}

// 삽입
void push(StackType *S, element e)
{
  if (is_full(S))
    printf("Overflow\n");
  else
  {
    S->top++;
    S->data[S->top] = e;
  }
}

// 삭제
element pop(StackType *S)
{
  if (is_empty(S))
  {
    printf("Empty\n");
    return -1;
  }
  else
  {
    element e = S->data[S->top];
    S->top--;
    return e;
  }
}

// 조회
element peek(StackType *S)
{
  if (is_empty(S))
  {
    printf("Empty\n");
    return -1;
  }
  else
  {
    return S->data[S->top];
  }
}

void print(StackType *S)
{
  for (int i = 0; i <= S->top; i++)
  {
    printf("%c ", S->data[i]);
  }
  printf("\n");
}

int main()
{
  StackType S;
  init(&S);

  pop(&S);
  push(&S, 'a');
  push(&S, 'b');
  push(&S, 'c');
  print(&S);

  element p = pop(&S);
  printf("%c\n", p);
  print(&S);
}

도움이 되었다면 아래 '공감' 버튼을 눌러주세요! 읽어주셔서 감사합니다 :)