Study/알고리즘

Java: 덱(Deque)의 개념과 사용

devyoseph 2021. 10. 24. 04:19

 

Double-Ended Queue

큐의 양쪽에 데이터를 넣고 뺄 수 있는 자료구조

큐 또는 스택으로도 사용할 수 있다

 

의 분류

한 쪽으로만 입력이 가능한 덱 = Scroll

한쪽으로만 출력이 가능한 덱 = Shelf

 

은 인터페이스

Deque의 자료구조는 interface로 정의되어있다

그렇기에 이를 구현해주는 클래스를 같이 쓰는데

ArrayDeque, LinkedBlockingDeque, ConcurrentLinkedDeque, LinkedList

등이 있다

 

 

Java에서의 덱(Double-Ended Queue)

Deque는 입력 출력의 방향이 자유로운 만큼 많은 메소드가 존재한다

클래스 연결

큐와 마찬가지로 2개를 import 해주어야 한다

import java.util.ArrayDeque;
import java.util.Deque;
public class Main {
public static void main(String[] args) {
	
    Deque<Integer> dq = new ArrayDeque<>();
    
}}

이렇게 연결하면 ArrayDeque 클래스 내부의 메소드를 사용할 수 있다

큐에서의 add와 offer / remove와 poll 형식을 그대로 사용할 수 있다

방향을 기억한다: First = 왼쪽, Last = 오른쪽

개념 큐(Queue) 덱(Deque)
push
.offer( 값 ); / .add( 값 ); .offerFirst( 값 );
.offerLast( 값 );
pop
.poll(); / .remove(); .pollFirst( 값 );
.pollLast( 값 );
top .peek(); .peekFirst();
.peekLast();
size .size(); .size();
empty .isEmpty(); .isEmpty();
검색 후 삭제
First = 왼쪽에서 탐색
Last = 오른쪽에서 탐색
  .removeFirstOccurrence( 제거할 값 );
.removeLastOccurrence( 제거할 값 );
.remove( 제거할 값 ); //First와 동일
값이 있는지 확인   .contain( Object o );
순회 (Iterator)
  .iterator(); //iterator로 변환한다
.descendingIterator(); //역순 변환

 

의 순회

※ 덱에서 클래스 내부에 iterator() 메소드로 iterator 형식의 변환을 할 수 있다

//iterator 연결
	Iterator<Integer> it = dq.iterator();
		while(it.hasNext()) {
			int n = it.next();
			System.out.println(n);
		}
//역순으로 iterator 형식 저장 후 연결
	Iterator<Integer> dcit = dq.descendingIterator()();
		while(dcit.hasNext()) {
			int n = dcit.next();
			System.out.println(n);
		}
//for문을 통한 순회
	for(Integer e : dq) {
		System.out.println(e);
	}