Queue와 Deque

최권민·2023년 7월 27일

자료구조

목록 보기
1/1
post-thumbnail

✔ Queue

  • LinkedList로 구성되어 있으며, 한 쪽에서는 삽입이 한 쪽에서는 삭제가 이루어지는 형태의 구조이다.
  • 위의 구조로 인해 선입선출(FIFO, First-in First-out)의 구조를 가진다.

✔ Deque

  • Double Ended Queue의 줄임말로, 보통 덱(Deck)이라고 읽는다.
  • Queue의 장점과 Stack의 장점을 합친 것으로, 큐의 시작과 끝이 이어져있어 양쪽 모두에서 삽입과 삭제가 가능하다.

✔ Java에서의 Queue와 Deque

  • 두 자료구조 모두 Java.util 에서 사용이 가능하다.
  • Deque같은 경우에는 Queue를 상속 받기 때문에, Queue의 메서드를 먼저 살펴보고, Deque에서는 어떻게 확장되었는지 알아보도록 하자.

✅ Queue

		// Queue는 LinkedList 기반
		Queue<String> que = new LinkedList<>();

		// ~~~ 삽입 : Queue는 맨 뒤로만 값을 넣을 수 있음

		// add : 맨 뒤로 값 삽입. 삽입 실패 시 에러 발생
		que.add("add1");
		que.add("add2");

		// offer : 맨 뒤로 값 삽입. 삽입 실패 시 아무 일도 발생하지 않음
		que.offer("offer1");
		que.offer("offer2");


		// ~~~ 확인 : 현재 큐의 첫 번째 값 확인
		
		que.element(); // 큐의 첫 번째 값 확인. 없을 시 에러 발생
		
		que.peek(); // 큐의 첫 번째 값 확인. 없을 시 null 반환


		// ~~~ 삭제 : 현재 큐의 첫 번째 값 삭제 및 반환

		que.remove(); // 큐의 첫 번째 값 삭제. 없을 시 에러 발생
		String a = que.remove();
		System.out.println(a);

		que.poll(); // 큐의 첫 번째 값 삭제. 없을 시 null 반환
		String b = que.poll();
		System.out.println(b);
  • Queue의 경우, LinkedList를 기반으로 하기 때문에 LinkedList로 선언한다.
  • 선입선출이 원칙이므로 맨 뒤로만 값을 넣고, 맨 앞으로만 값을 삭제할 수 있다.
  • 각 메서드별로 Error를 발생시키는 것과 무시하는 것 두 가지로 나뉜다.

✅ Deque

		Deque<String> que = new ArrayDeque<>();
		
		
		// 삽입 관련
		
		// add : 공간이 부족하여 삽입할 수 없을 때 에러를 발생시킨다.
		que.addFirst("addFirst");
		System.out.println("que = " + que);

		que.add("add");
		System.out.println("que = " + que);

		que.addLast("addLast");
		System.out.println("que = " + que);

		// addAll : 다른 Collection의 값들을 맨 뒤에 삽입한다.
		Deque<String> que2 = new ArrayDeque<>(Arrays.asList("addAll1", "addAll2"));
		que.addAll(que2);
		System.out.println("que = " + que);

		// offer : 공간이 부족하여 삽입할 수 없을 때 아무 일도 일어나지 않는다.
		que.offerFirst("offerFirst");
		System.out.println("que = " + que);

		que.offer("offer");
		System.out.println("que = " + que);

		que.offerLast("offerLast");
		System.out.println("que = " + que);


		// 확인 관련

		// get : Queue의 element와 동일.
		// 맨 앞이나 뒤의 값을 확인하고, 없을 경우 에러를 발생시킨다.

		System.out.println(que.getFirst());
		System.out.println(que.getLast());

		// peek : 맨 앞이나 뒤의 값을 확인하고, 없을 경우 null을 반환한다.

		System.out.println(que.peekFirst());
		System.out.println(que.peek());
		System.out.println(que.peekLast());


		// 삭제 관련
		
		// remove : 맨 앞이나 뒤의 값을 삭제 및 반환. 없을 시 에러 발생
		System.out.println(que.removeFirst());
		System.out.println(que.remove());
		System.out.println(que.removeLast());

		// 지정 삭제
		que.removeFirstOccurrence("addAll1"); // 맨 처음에 나오는 해당 값을 삭제. 없을 시 변경 없음
		que.removeLastOccurrence("addAll2"); // 맨 마지막에 나오는 해당 값을 삭제. 없을 시 변경 없음


		// poll : 맨 앞이나 뒤의 값을 삭제 및 반환. 없을 시 null 반환
		System.out.println(que.pollFirst());
		System.out.println(que.poll());
		System.out.println(que.pollLast());

		// 스택 관련
		que.push("push"); // Stack의 push와 동일. addFirst와 동일하게 작동
		
		que.pop(); // Stack의 pop과 동일. removeFirst와 동일하게 작동
  • 앞서 말했듯, Deque는 Queue를 상속하기 때문에 관련 메서드를 모두 사용할 수 있다.
  • 이외에도, 앞 뒤로 자유롭게 삽입 및 삭제가 가능하기 때문에, 관련 메서드들이 추가되었다.
  • removeFirstOccurrence와 removeLastOccurrence가 추가되어, 탐색의 방향을 설정할 수 있으며 addAll로 다른 컬렉션의 값을 삽입하기 용이하다.

참고자료

https://docs.oracle.com/javase/8/docs/api/

profile
하나의 궤적을 따라서

0개의 댓글