1. Stack?

  1. [설명]

    1. LIFO구조로 되어있어서 마지막에 저장한 데이터를 가장 먼저 꺼내게 됩니다
    2. stack클래스로 구현하여 제공합니다
  2. [Stack 구현]

    1. push
      1. stack에 객체를 저장합니다
    2. pop
      1. stack의 맨 위에 저장된 객체를 꺼냅니다
    3. peek
      1. stack의 맨위에 저장된 객체를 반환합니다
      2. stack에서 꺼내지는 않습니다
      3. 값이 없을때[비었을 때] null을 반환합니다
    4. empty
      1. stack이 비어있는지 알려줍니다
      2. boolean 타입을 생각하시면 됩니다(true[있으면], fasle[없으면])
    5. search
      1. stack에서 주어진 객체를 찾아서 그 위치를 반환합니다(배열과는 달리 1부터 시작합니다)
  3. [예제]

    // Stack
    Stack<Integer> st = new Stack<>();
    
    // push
    st.push(10);
    st.push(20);
    
    // while문 => empty, pop
    while(!st.empty()) {
    	System.out.println("stack : " + st.pop());
    }
    
    // stack 결과
    // stack : 20
    // stack : 10
    

2. Queue?

  1. [설명]

    1. 먼저 들어간 데이터를 먼저 꺼내는 FIFO구조로 되어 있다
    2. queue 인터페이스로만 정의해 놓았을 뿐 별도의 클래스를 제공하지 않습니다
    3. queue인터페이스를 구현한 클래스들이 있어서 이 들 중의 하나를 선택해서 사용하면 됩니다
  2. [Queue 구현]

    1. add
      1. queue에 객체를 저장합니다
      2. boolean 타입을 생각하시면 됩니다(성공하면[true], 실패하면[false])
    2. element
      1. 삭제없이 저장된 요소를 읽어 옵니다
      2. peek와 다른점은 queue가 비었을 때는 Exception을 발생 시킵니다(peek에서는 null를 반환시킨다는 점)
    3. offer
      1. queue에 객체를 저장합니다
      2. add와 동일하게 boolean 타입을 생각하시면 됩니다(성공하면[true], 실패하면[false])
    4. peek
      1. 삭제없이 읽어옵니다
      2. queue가 비었을 때 null을 반환 해줍니다
    5. poll
      1. queue를 꺼내옵니다
      2. 비어있으면 null을 반환해 줍니다
    6. remove
      1. queue에서 꺼내옵니다
      2. 비어 있으면 예외를 발생 시킵니다
  3. [예제]

    // Queue
    Queue<Integer> qu = new LinkedList<>();
    
    // offer
    qu.offer(10);
    qu.offer(20);
    qu.offer(30);
    
    // while문 => empty, poll
    while(!qu.empty()) {
    	System.out.println("queue : " + qu.poll());
    }
    
    // queue 결과
    // queue : 10
    // queue : 20
    // queue : 30
    

3. Priority Queue?

  1. [설명]

    1. Queue 인터페이스의 구현체 중 하나입니다
    2. 저장한 순서에 관계없이 우선순위(priority)가 높은 것 부터 꺼냅니다
    3. null값은 저장 할 수 없습니다
    4. 각 요소를 ‘Heap’이라는 자료구조로 저장합니다
      1. Heap
        1. 2진트리의 일종이며, 우선순위 Queue를 위하여 만들어진 자료구조입니다
        2. 여러 개의 값 중 최대값과 최소값을 빠르게 찾아내도록 만들어진 자료구조입니다
        3. 부모와 자식 관계는 일정하지만 형제 사이의 대소 관계는 일정하지 않습니다
        4. 트리에서는 중복된 값을 허용하지 않습니다
        5. 가장 높은 우선순위를 가지는 노드가 항상 루트에 위치합니다
  2. [예제]

    // Priority Queue
    Queue<Integer> pqu = new PriorityQueue<>();
    
    // offer
    pqu.offer(10);
    pqu.offer(20);
    pqu.offer(5);
    
    // while => isEmpty, poll
    while(!pqu.isEmpty()) System.out.println("priority queue : " + pqu.poll());
    
    // Priority Queue 결과
    // priority queue : 5
    // priority queue : 10
    // priority queue : 20
    
    // 우선순위 높은 순서대로 출력을 원한다면?
    // Queue<Integer> pqu = new PriorityQueue<>(Collections.reverseOrder());
    // Collections.reverseOrder() 설정해주면 됩니다
    

4. Deque(Double-Ended Queue)?

  1. [설명]

    1. 덱 or 디큐는 양쪽 끝에 추가/삭제가 가능합니다
    2. 덱의 조상은 Queue이고, 구현체로는 ArrayDeque, LinkedList등이 있습니다
    3. Stack과 Queue를 하나로 합쳐놓았다고 생각하시면 됩니다
    4. [추가 설명]
      1. 어느 쪽이든 사용이 가능합니다

      2. 덱 메서드에 대응하는 Queue와 Stack의 메서드입니다

      3. [비교(Deque, Queue, Stack)]

        //   Deque        Queue         Stack
        /*
        	 offerLast()    offer()       push()
           pollLast()       -            pop()
           peekFirst()     peek()         -
           peekLast()       -           peek()
        */
        
  2. [예제]

    // Deque
    Deque<Integer> deq = new ArrayDeque<>();
    
    // Queue
    deq.offerLast(10);
    deq.offerLast(20);
    deq.offerLast(30);
    
    // pollFirst
    int numTen = deq.pollFirst();
    int numTwenty = deq.pollFirst();
    
    // Queue, pollFirst 출력
    System.out.println("numTen : " + numTen);
    System.out.println("numTwenty : " + numTwenty);
    System.out.println("Deque : " + deq);
    
    // Queue, pollFirst 결과
    // numTen : 10
    // numTwenty : 20
    // Deque : [30]
    
    // Stack
    deq.offerLast(40);
    deq.offerLast(50);
    
    // pollLast
    int numFifty = deq.pollLast();
    int numForty = deq.pollLast();
    
    // Stack, pollLast 출력
    System.out.println("numFifty : " + numFifty);
    System.out.println("numForty : " + numForty);
    System.out.println("Deque : " + deq);
    
    // Stack, pollLast 결과
    // numFifty : 50
    // numForty : 40
    // Deque : [30]