Keep going

큐 본문

Records/자료구조&알고리즘

코딩천재홍 2021. 1. 23. 22:04

큐란?

큐는 스택과 마찬가지로 데이터를 일시적으로 쌓아 두기 위한 자료구조입니다. 

가장 먼저 넣은 데이터를 가장 먼저 꺼내는 선입선출(FIFO) 구조로 되어 있습니다.

 

인큐(enque) : 큐에 데이터를 넣는 작업

디큐(deque) : 데이터를 꺼내는 작업

프런트(front) : 데이터를 꺼내는 쪽

리어(rear) : 데이터를 넣는 쪽 

 

배열로 큐 만들기 

인 큐 할때 시간 복잡도 : O(1)

디 큐 할때 시간 복잡도 : O(n) → 첫 요소를 꺼낸 다음에 두번째 이후의 요소를 모두 맨 앞으로 옮긴다. (비효율적)

 

링 버퍼로 큐 만들기

링 버퍼는 배열의 처음이 끝과 연결되어있다고 보는 자료구조이다. (배열 요소를 앞쪽으로 옮기지 않아도 된다.)

- 프런트 : 맨 처음 요소의 인덱스

- 리어 : 맨 끝 요소의 하나 뒤의 인덱스 (다음 요소를 인큐할 위치를 미리 지정)

 

인큐 메서드 enque

큐에 데이터를 인큐하는 메서드.

인큐에 성공하면 인큐한 값을 그대로 반환합니다.

큐가 가득 차서 인큐할 수 없으면 내가 만든 예외 클래스(OverflowIntQueueException)를 던집니다.

인큐하고 rear 와 num의 값을 1만큼 증가하고, rear 값과 max값이 같아질 경우 rear를 배열의 처음인 0으로 변경해야 합니다.

 

디큐 메서드 deque

큐에서 데이터를 디큐하고 그 값을 반환하는 메서드.

만약 큐가 비어 있어 디큐할 수 없으면 예외 EmptyIntQueueException을 던집니다.

큐에 저장한 값 하나를 꺼내고 front 값을 1만큼 증가, 다음 num값을 1만큼 감소합니다.

front값이 max의 값과 같아질 경우 front 값을 배열의 처음인 0으로 변경해야 합니다.

 

package Chapter04;
 
public class IntQueue {
    private int max; // 큐의 용량
    private int front; // 첫번째 요소 커서
    private int rear; // 마지막 요소 커서
    private int num; // 현재 데이터 수
    private int[] que; // 큐본체
 
    public class EmptyIntQueueException extends RuntimeException {
        public EmptyIntQueueException() {
        }
    }
 
    public class OverflowIntQueueException extends RuntimeException {
        public OverflowIntQueueException() {
        }
    }
 
    public IntQueue(int capacity) {
        num = front = rear = 0;
        max = capacity;
        try {
            que = new int[max];
        } catch (OutOfMemoryError e) {
            max = 0;
        }
    }
 
    public int enque(int x) throws OverflowIntQueueException {
        if (num >= max)
            throw new OverflowIntQueueException();
        que[rear++= x;
        num++;
        if (rear == max)
            rear = 0;
        return x;
    }
 
    public int deque() throws EmptyIntQueueException {
        if (num <= 0)
            throw new EmptyIntQueueException();
        int x = que[front++];
        num--;
        if (front == max)
            front = 0;
        return x;
    }
 
    public int peek() throws EmptyIntQueueException {
        if (num <= 0)
            throw new EmptyIntQueueException();
        return que[front];
    }
 
    // 큐에서 x를 검색하여 인덱스 (찾지 못하면 -1)를 반환
    public int indexOf(int x) {
        for (int i = 0; i < num; i++) {
            int idx = (i + front) % max;
            if (que[idx] == x) // 검색성공
                return idx;
        }
        return -1// 검색실패
    }
 
    public void clear() {
        num = front = rear = 0;
    }
 
    public int capacitiy() {
        return max;
    }
 
    public int size() {
        return num;
    }
 
    public boolean isEmpty() {
        return num <= 0;
    }
 
    public boolean isFull() {
        return num >= max;
    }
 
    public void dump() {
        if (num <= 0)
            System.out.println("큐가 비어있습니다.");
        else {
            for (int i = 0; i < num; i++) {
                System.out.println(que[(i + front) % max] + " ");
                System.out.println();
            }
        }
    }
 
}
 
cs

 

 


출처 : Do it! 자료구조와 함께 배우는 알고리즘 입문 : 자바 편 [시바타 보요, 옮긴이 : 강민 (이지스퍼블리싱)]

'Records > 자료구조&알고리즘' 카테고리의 다른 글

정렬 -1  (0) 2021.01.29
재귀 알고리즘  (0) 2021.01.27
스택  (0) 2021.01.04
이진 검색  (0) 2021.01.03
순차 검색  (0) 2021.01.03
Comments