Queue

Last updated - 2023년 04월 26일 Edit Source


    # 큐 기본개념

    큐 (Queue) : 삽입과 삭제 연산이 FIFO로 이뤄지는 자료구조

    • FIFO (First-In-First-Out, 선입선출) : 가장 처음에 들어온 것이 가장 먼저 나감
      • 입력을 rear, 출력을 front로 제한
        • 큐의 가장 첫 원소가 front, 끝 원소가 rear
        • 들어오는건 rear로 들어오고, 나가는건 front부터 빠지는거임
    • 버퍼, 대기 큐, BFS 등 다양한 곳에서 사용됨

    큐를 구성하는 4가지 기능

    • add() : 맨 끝 (rear)에 데이터 추가
    • remove() : 맨 앞 (front)에서 데이터 꺼내기
    • peek() : 맨 앞 (front)에 데이터 보는거
    • isEmpty() : 큐가 비었는지 확인


    # 큐 자바로 구현해보기


     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    
    import java.util.NoSuchElementException;  
      
    class Queue<T> {  
        class Node<T> {  
            // 제네릭 타입인 T로 data 받음  
            private T data;  
            // 다음 노드 next        private Node<T> next;  
      
            public Node(T data) {  
                this.data = data;  
            }  
        }  
      
        // 큐는 앞, 뒤의 주소 알아야하니까  
        private Node<T> first;  
        private Node<T> last;  
      
        public void add(T item) {  
            // add 할 아이템을 가지고 Node 를 하나 생성  
            Node<T> t = new Node<T>(item);  
      
            // 마지막 Node 가 있다면 거기에 item 붙이기  
            if (last != null) {  
                last.next = t;  
            }  
      
            // 이제 t가 마지막 노드가 됨  
            last = t;  
      
            // 데이터가 없을 때  
            if (first == null) {  
                first = last;  
            }  
        }  
      
        public T remove() {  
            // 큐가 비어있으면  
            if (first == null) {  
                throw new NoSuchElementException();  
            }  
      
            // 맨 앞에 있는 데이터를 반환하기 전에  
            // 그 다음에 있는 녀석을 first 으로 만들어줘야함  
            // 그래서 데이터 백업해놓는거  
            T data = first.data;  
            first = first.next;  
      
            if (first == null) {  
                last = null;  
            }  
      
            return data;  
        }  
      
        public T peek() {  
            if (first == null) {  
                throw new NoSuchElementException();  
            }  
            return first.data;  
        }  
      
        public boolean isEmpty() {  
            return first == null;  
        }  
    }  
      
    public class QueueTest {  
        public static void main(String[] args) {  
            Queue<Integer> queue = new Queue<Integer>();  
            queue.add(1);  
            queue.add(2);  
            queue.add(3);  
            queue.add(4);  
            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());  
            System.out.println(queue.remove());  
            System.out.println(queue.isEmpty());  
        }  
    }
    
    // 1
    // 2
    // 3
    // 3
    // false
    // 4
    // true
    

    Comment