Stack 이란?

후입선출(LIFO : Last-In First-Out)의 특성을 가지는 자료구조(Data Structure)를 일컫는다.

Stack에서의 입출력은 맨 위에서만 일어나고 스택의 중간에서는 데이터를 삭제할 수 없다.

Stack에서 입출력이 이루어지는 부분을 스택 상단(stack top) 이라 하고 반대쪽인 바닥 부분을 스택 하단(stack bottom) 이라고 한다.

Stack에 저장되는 것을 요소(element)라 부르며, Stack에 요소가 하나도 없을 때 그러한 Stack을 공백 스택(empty stack) 이라고 한다.

DataStructure_Stack


Stack의 연산

  • push() : 삽입 연산으로 스택의 맨 위에 item을 추가한다.
  • pop() : 삭제 연산으로 스택의 맨 위의 원소를 제거해서 반환한다.
  • is_empty() : 스택이 공백상태에 있는지 검사한다.
  • is_full() : 스택이 포화상태에 있는지 검사한다.
  • peek() : 스택의 맨 위의 원소를 제거하지 않고 반환한다.

DataStructure_Stack


Stack의 구현

Stack을 구현하는 방법에는 배열을 이용하는 방법과 연결 리스트를 이용하는 방법이 있다.

  • 배열은 구현하는 방법은 간단하고 성능이 우수한 반면에 스택의 크기가 고정되는 약점이 있다.

  • 연결리스트를 이용하는 방법은 구현이 약간 복잡한 반면, 스택의 크기를 필요에 따라 가변적으로 할 수 있다.

정수 배열 Stack 구현

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

#define MAX_STACK_SIZE 100     // Stack의 최대 크기
typedef int element;           // Data 자료형
element stack[MAX_STACK_SIZE]; // 1차원 배열
int top = -1;

//공백상태 검출
int is_empty(){
    return (top == -1);
}

//포화상태 검출
int is_full(){
    return(top == (MAX_STACK_SIZE - 1));
}

//삽입 연산
void push(element item){
    if(is_full()){
        fprintf(stderr, "스택 포화 에러");
        return;
    }
    else stack[++top] = item;
}

//삭제 연산
element pop(){
    if(if_empty()){
        fprintf(stderr, "스택 공백 에러");
        exit(1);
    }
    else return stack[top--];
}

//peek function
element peek(){
    if(is_empty()){
        fprintf(stderr, "스택 공백 에러");
        exit(1);
    }
    else return stack[top];
}

int main (void){
    push(1);
    push(2);
    push(3);
    printf("%d\n", pop());
    printf("%d\n", pop());
    printf("%d\n", pop());
    return 0;
}

실행 결과

3
2
1

Java에서의 Stack

java에서 Stack은 jata.util.Stack을 import해주면 바로 사용 할 수 있다.

Stack 선언

import java.util.Stack; //import Stack
Stack<Integer> stack = new Stack<>();
Stack<String> stack = new Stack<>();

Stack 메서드

stack.push(5); //stack에 값 5 추가
stack.pop(); //stack의 마지막 push 제거
stack.clear(); //stack 전체 삭제
stack.peek(); //stack의 마지막 push값 확인
stack.size(); //stack의 크기 확인
stack.empty(); //stack의 공백 여부 확인
stack.contains(1); //stack안에 '1'이 들어있으면 true, stack안에 값을 확인