덱
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);
}
'Study > 알고리즘' 카테고리의 다른 글
그리디 알고리즘(Greedy Algorithm)의 이해와 적용 (0) | 2021.11.02 |
---|---|
Java: 동적 계획법(Dynamic Programming) 개념과 이해 (0) | 2021.10.31 |
Java: 큐(Queue)의 개념과 사용법, 요세푸스 순열 (0) | 2021.10.22 |
Java: 스택(Stack)의 개념과 사용법 (0) | 2021.10.22 |
알고리즘: 선형/비선형 구조와 브루트 포스(Brute Force) (0) | 2021.10.17 |