Today
-
Yesterday
-
Total
-
  • Queue 큐
    Computer Science/자료구조 2023. 11. 20. 00:01

    큐 Queue

    선입선출 = FIFO = LIFO = 들어온 순서대로 나감

    Java

    큐는 자바에선 인터페이스로 존재하기 때문에 Queue 자체를 사용하려면 Queue 인터페이스를 상속 받아 구현해야 한다.

    구현하는 대신에 Queue를 상속받아 활용한 LinkedList를 사용할수도 있다.

    • Q.add( data ) = 큐에 data 입력
    • Q.poll() = 큐에서 값을 꺼냄
      -> 맨 앞에 위치하는 값이 나온다.
      -> 값을 그냥 삭제하지 않고 들고 나오기 때문에 , 이 값을 사용하려면 적당한 변수에 담아주면 된다.
      -> int outNum = Q.poll()
    • Q.peek() = 지금 사용 할 수 있는 값(맨앞에 있는 값)을 복사해오는 메서드
    • Q.contains( data ) = 큐에 data가 들어있는지 확인
    • Q.clear() = 큐에 들어있는 값 모두 삭제

     

     

    큐가 비어있을 때 poll() 연산을 실행한다면?

    Stack과는 다르게,
    LinkedList로 구현된 객체를 사용해서 그런지 에러문구를 띄우지 않고 null 상태임을 알려주고 정상 종료 된다.



    Ring Buffer 를 이용해서 큐 구조 이해하기

    Ring Buffer

    원형으로 연결 된 자료 구조 형태

    데이터를 이동하지 않고, front 와 rear 포인터를 이동하면서 데이터를 관리한다.

     

    구현 해보기

    class MyQueue<T> {
        T[] q;
    
        private int front;
        private int rear;
    
        private int dataCount;
        private int size;
    
        private MyQueue(){}
        public MyQueue(int size) {
            this.front = 0;
            this.rear = 0;
            this.dataCount = 0;
            this.size = size;
    
            q = (T[]) new Object[size];
        }
    
        public T add(T data) {
            if (dataCount < size) {
                dataCount++;
    
                q[rear] = data;
    
                rear = (rear + 1) % size;
    
                return data;
            } else {
                System.out.println(" [ add 실패 : " + data + " ] 큐가 가득 찼습니다. ");
    
                return null;
            }
        }
    
        public T poll() {
            if (dataCount > 0) {
                dataCount--;
    
                T data = q[front];
                q[front] = null;
    
                front = (front + 1) % size;
    
                return data;
            }
    
            System.out.println(" [ poll 실패 ] 큐가 비었습니다. ");
            return null;
        }
    
        public T peek() {
            return q[front];
        }
    
        public boolean contains(T data) {
            for (int i = 0; i < dataCount; i++) {
                int idx = (front + i) % size;
                if (data.equals(q[idx]))
                    return true;
            }
    
            return false;
        }
    
        public void clear() {
            while (dataCount > 0) {
                poll();
            }
    
            front = 0;
            rear = 0;
        }
    
        public void print() {
            System.out.println(this);
        }
    
        @Override
        public String toString() {
            return  "  MyQueue : " + Arrays.toString(q) + "\n" +
                    "    front : " + front + "\n" +
                    "     rear : " + rear + "\n" +
                    "dataCount : " + dataCount + "\n" ;
        }
    }

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

    트리  (0) 2023.11.21
    Linked List 연결리스트  (0) 2023.11.20
    해시맵 HashMap  (0) 2023.11.20
    배열 array  (0) 2023.11.20
    Stack 스택  (0) 2023.11.20

Designed by Tistory / Custom by 얼거스