본문 바로가기

개발 관련 부가 지식/자바, 스프링

Java Queue 구현

728x90
728x90

Queue은? FIFO(Firs-In First-Out) 형태의 자료 구조 ✔

 

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

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

-> MyNode를 MyQueue 안에 정의하는 이유는 MyNode 의 private 필드를 접근하기 위함 ✔

 

Queue의 메소드 👀

->add() : 맨 끝에다 데이터 추가

->remove() : 맨 앞 데이터 꺼냄

->peek() : 맨 앞 데이터 보는 것

->isEmtpy() : Queue가 비었는지 확인

 

public class MyQueue<T> {

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

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

    //-------------> Queue는 FIFO 구조로 first, last 둘 다 관리
    
    private MyNode<T> first;
    private MyNode<T> last;


    //-------------> add를 할때마다 last의 node를 바꿔줘야함
    //-------------> Queue가 빈 상태에서 처음 데이터 add시에는 first와 last가 같음!!
    
    public void add(T item) {
        MyNode<T> t = new MyNode<T>(item);
        
        if(last != null) {
        	last.next = t;
        }
        last = t;
        
        if(first == null) {
        	first=last;
        }
    }
    
    
    //-------------> remove는 현재 first의 data 값을 리턴해줘야 하고, 리턴 전에 first를 next의 node로 바꿔줘야함
    //-------------> first.next가 null 일 시에는 last도 null로 바꿔줌

    public T remove() {
        if (first == null) {
            throw new NullPointerException();
        }
        T data = first.data; 
        first = first.next; 
        if (first == null) {
            last == null;
        }
        return data; 
    }


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


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

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

(디버깅을 하면서 코드를 보시면 훨씬 이해하기 쉬워요) ✔

 

👏

👏