본문 바로가기

개발 관련 부가 지식/기타

Java Stack 구현

728x90
728x90

Stack은? LIFO(Last-In First-Out) 형태의 자료 구조

 

Stack 자료 구조 java로 구현해 보았다.

-> MyNode라는 객체를 가지고 로직 구현을 함, MyNode는 입력데이터와 다음 MyNode의 주소 값을 가지고 있음

public class MyStack<T> {

    class MyNode<T> {
        private T data;
        private MyNode<T> next;

        public MyNode(T data) {
            this.data = data;
        }
    }

    //-------------> Stack은 LIFO 구조로 top만 클래스안에서 직접 관리
    
    private MyNode<T> top;


    //-------------> push를 할때마다 top의 node를 바꿔줘야함
    //-------------> (1). 기존 top을 입력한(생성한) node의 다음 값으로 할당함
    //-------------> (2). top을 입력한(생성한) node로 바꿈
    
    public void push(T item) {
        MyNode<T> node = new MyNode<T>(item);
        node.next = top; //(1)
        top = node; //(2)
    }
    
    
    //-------------> pop은 현재 top의 data 값을 리턴해줘야 하고, 리턴 전에 top을 next의 node로 바꿔줘야함
    //-------------> (1). 리턴할 top의 data값을 변수로 빼놓음
    //-------------> (2). top을 top의 다음 node값으로 바꿈
    //-------------> (3). (1)로 뺴놓은 값을 리턴함
    
    public T pop() {
        if (top == null) {
            throw new NullPointerException();
        }
        T item = top.data; //(1)
        top = top.next; //(2)
        return item; //(3)
    }


    //-------------> peek은 현재 top의 data 값만 출력
    
    public T peek() {
        if (top == null) {
            throw new NullPointerException();
        }
        return top.data;
    }


    //-------------> top이 비었는지만 출력
    
    public boolean isEmpty() {
        return top == null;
    }
}

class Test {
    public static void main(String[] args) {
        MyStack<Integer> stack = new MyStack<Integer>();
        stack.push(1);
        stack.push(2);
        stack.push(3);
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.peek());
        System.out.println(stack.pop());
        System.out.println(stack.isEmpty());
        /*  출력 값
        3
        2
        1
        1
        true
        * */
    }
}

(디버깅 통해서 하나씩 살펴보면 더 이해하기 쉬워요) ✔

 

👏

👏