본문 바로가기
Computer Science/자료구조

덱(Deque)

by Libi 2021. 6. 29.
반응형

덱(Deque)은 double-ended queue의 줄임말로서 큐의 전단(Front)과 후단(Rear)에서 모두 삽입과 삭제가 가능한 큐를 의미한다. 스택(Stack)과 큐(Queue), 2개의 자료구조를 덱(Deque)을 활용하여 구현 및 사용할 수 있다.

전단 삽입(add_front), 삭제(delete_front), 후단 삽입(add_rear), 삭제(delete_rear) 총 4 가지 기본 연산을 가지고 있다.

 

덱(Deque)은 큐(Queue)를 업그레이드한 자료구조로써 JAVA에선 큐(Queue)처럼 간단하게 라이브러리를 추가하여 별다른 구현 없이 생성할 수 있다.

import java.util.Deque;
import java.util.LinkedList;
Deque<"자료형"> "덱 이름" = new LinkedList<>();

 

덱은 선형 자료구조로써 배열(선형, 원형), 연결 리스트를 이용하여 구현할 수 있다. 하지만 보통 이중 연결 리스트로 구현된다. 그 이유는 전단과 후단에서 모두 삽입, 삭제가 가능해야 하기 때문에 양쪽으로 링크를 가지고 있어야 편리하기 때문이다.

다음은 이중 연결 리스트로 간단하게 구현한 덱(Deque)이다.

class MyDeque<T> {
	private Node front, rear;
	private int size;
	
	class Node<T> {
		private T data;

		public Node(T data) {
			this.data = data;
			prev = next = null;
		}

		private Node prev, next;
	}

	public MyDeque(){
		front = rear = null;
	}

	public void add_front(T data) {
		Node node = new Node(data);
		
		if (is_Empty()) {
			front = node;
			rear = node;
		} else {
			front.prev = node;
			node.next = front;
			front = node;
		}
		size++;
	}

	public void add_rear(T data) {
		Node node = new Node(data);

		if (is_Empty()) {
			front = node;
			rear = node;
		} else {
			rear.next = node;
			node.prev = rear;
			rear = node;
		}
		size++;
	}

	public T delete_front() {
		if (is_Empty()) {
			return null;
		}

		T ret = (T)front.data;
		if (front.next == null) {
			front = rear = null;
		} else {
			front = front.next;
			front.prev = null;
		}
		size--;
		return ret;
	}

	public T delete_rear() {
		if (is_Empty()) {
			return null;
		}

		T ret = (T)rear.data;
		if (rear.prev == null) {
			front = rear = null;
		} else {
			rear = rear.prev;
			rear.next = null;
		}
		size--;
		return ret;
	}

	public int get_front() {
		return (int) front.data;
	}

	public int get_rear() {
		return (int) rear.data;
	}

	public int get_Size() {
		return size;
	}

	public boolean is_Empty() {
		if (get_Size() == 0) return true;
		return false;
	}
}

구현한 덱(Deque)으로 간단한 예제를 테스트한 결과는 다음과 같다.

MyDeque<Integer> dq = new MyDeque<>();
dq.add_front(10);
dq.add_front(3);
dq.add_rear(5);
System.out.println(dq.get_Size());
System.out.println(dq.is_Empty());
System.out.println(dq.delete_front());
System.out.println(dq.delete_rear());
System.out.println(dq.delete_rear());
System.out.println(dq.is_Empty());

반응형

'Computer Science > 자료구조' 카테고리의 다른 글

그래프(Graph)  (0) 2021.06.30
우선순위 큐(Priority Queue)  (0) 2021.06.30
트리(Tree)  (0) 2021.06.30
큐(Queue) : FIFO  (0) 2021.06.29
스택(Stack) : LIFO  (0) 2021.06.29

댓글