for Programming study

스택(Stack)

|

이 포스팅은 숭실대학교 컴퓨터학부 신용태 교수님의 자료구조 수업을 기반으로 작성되었습니다.

스택(Stack)이란

LIFO 구조 즉 후입선출 구조를 갖는 자료구조인데, 한쪽 끝으로만 데이터의 추가 삭제가 이루어지는 구조입니다.
책이 쌓여 있는 모습을 생각하시면 이해가 빠르실겁니다.
대표적인 연산으로는 스택에서 top 데이터를 추출하는 Pop, 반대로 데이터를 삽입하는 Push연산이 있습니다.
간단한 그림으로 표현하면 다음과 같습니다. stack

JAVA CODE로 구현

자바 API에 구현된 스택 기능이 있으나, 이해를 위해 직접 스택 코드를 구현하였습다.
코드는 크게 5가지 부분으로 작성되어 있고, 어떤 타입의 데이터라도 사용할 수 있게 Object 타입을 사용했습니다.

  • StackADT() : StackADT 클래스의 생성자, 스택 배열을 사이즈를 지정하여 초기화 해준다.
  • pop() : 스택의 가장 TOP 데이터, 즉 가장 마지막에 추가된 데이터를 꺼낸 후 스택 배열에서는 삭제한다.
  • push() : 스택 배열에 가장 마지막에 아이템을 데이터를 추가해준다.
  • peek() : 스택 배열에서 아이템을 삭제하지 않고도 TOP 데이터를 확인할 수 있게 해준다.
  • isEmpty() : 스택 배열이 비어있으면 true를 리턴해준다.
public class StackADT {
    private Object[] data; //스택 배열
    private int manyItems; //아이템의 개수
    public StackADT(int size){ //size 크기의 스택 배열 생성
        manyItems =0; // 스택에 저장된 아이템 개수 0에서 시작
        data = new Object[size];
    }
    public Object pop(){
        Object toPop; //pop한 데이터를 리턴하기 위해 선언
        if(isEmpty()) { //비어있는 스택인지 확인
            return "Empty";
        }
        toPop = data[--manyItems]; //top 데이터를 toPop에 저장
        data[manyItems] = null; //저장한 데이터를 삭제
        return toPop;
    }
    public void push(Object item){
        if(manyItems == data.length){ //스택 배열이 꽉 찼는지 확인
            System.out.println("Stack is Full");
            return;
        }
        data[manyItems] = item;
        manyItems++;
    }
    public boolean isEmpty(){
        return manyItems==0;
    }
    public Object peek(){
        if(isEmpty()){ //비어있는 스택인지 확인
            return "empty";
        }
        return data[manyItems-1]; //배열의 인덱스는 0부터 시작하므로 item개수 -1을 해준다.
    }

    public static void main(String[] args){
        StackADT stack = new StackADT(3);
        System.out.println("Pushing elements in Stack");
        for(int i = 1; i<=3; i++) { //반복문을 통해 push
            System.out.println("Push :"+ i);
            stack.push(i );
        }
        System.out.println("Is stack empty? : "+stack.isEmpty());
        System.out.println("Peek : "+ stack.peek());

        System.out.println("Pop all element from Stack");
        for(int i=0; i<4; i++) //반복문을 통해 pop
            System.out.println("Pop : " + stack.pop());

        System.out.println("Is stack empty? : "+stack.isEmpty());
    }
}

실행 결과

stack 코드를 실행해보면 반복문을 통해 1, 2, 3을 차례대로 스택에 push하고 스택 배열이 비어있는지 확인합니다.
또 peek()를 통해 스택의 top 데이터를 확인하고. 스택에 데이터를 차례대로 pop 했을때 3, 2, 1 순서로 데이터가 출력되는것을 확인할 수 있습니다.