티스토리 뷰

스택(Stack)이란?

쌓아놓은 더미라는 뜻. 데이터를 바닥에서부터 쌓아 올리는 구조.

 

스택에서 데이터 입/출력은 오로지 스택의 꼭대기에서만 이루어진다. 스택의 맨 아래에 있는 데이터를 꺼내려면 그 위에 있는 데이터를 모두 걷어내야 한다.

 

이처럼 스택은 가장 마지막에 들어간 데이터가 제일 먼저 나오는 LIFO(Last In - First Out : 후입선출) 형태를 띤다. 요소의 삽입과 삭제가 한쪽 끝에서만 이루어지는 것이 스택의 특징이다.

 

스택의 연산은 Push, Pop이 있다.

Push 함수는 스택에 데이터를 추가한다.

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

 

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

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

 

Push, Pop, Peek 구현하기

 

#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);
}

 

 

 

 

 

 

 

 

 

 

 

 

'자료구조' 카테고리의 다른 글

[자료구조] 스택 프레임 (Stack Frame)  (0) 2024.02.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
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
글 보관함