알고리즘

Deque 덱

김긍수 2021. 2. 26. 03:55

1. Deque 덱이란?

: Double-Ended Queue이다. 큐의 양쪽끝에서 삽입과 삭제가 모두 발생할 수 있는 큐이다.

양방향 큐, 즉 스택으로도 사용할 수 있고 큐처럼 사용할 수 있는 자료구조이다.

 

2. 연결리스트를 이용한 Deque 구현 코드

class DequeType {
	Node head;
	Node tail;
	
	public DequeType() {
		head = null;
		tail = null;
	}
	
	//초기화 함수
	public void init() {
		head = null;
		tail = null;
	}
	
	//비어있나?
	public boolean isEmpty() {
		return head == null;
	}
	
	//전단 삽입
	public void add_head(int data) {
		Node newNode = new Node(data);
		
		if (isEmpty()) {
			head = newNode;
			tail = newNode;
		} else {
			newNode.rlink = head;
			head.llink = newNode;
			head = newNode;
		}
	}
	
	//후단 삽입
	public void add_tail(int data) {
		Node newNode = new Node(data);
		
		if (isEmpty()) {
			head = newNode;
			tail = newNode;
		} else {
			tail.rlink = newNode;
			newNode.llink = tail;
			tail = newNode;
		}
	}
	
	//전단 삭제
	public int delete_front() {
		Node removed_node;
		int item;
		
		if (isEmpty()) 
			return -1;
		else {
			removed_node = head;
			item = removed_node.data;		
			head = removed_node.rlink;
			
			if (head != null) {
				head.llink = null;
			} else {
				tail = null;
			}
			return item;
		}
	}
    
	//후단 삭제
	public int delete_tail() {
		Node removed_node;
		int item;
		
		if (isEmpty())
			return -1;
		else {
			removed_node = tail;
			item = removed_node.data;
			tail = removed_node.llink;
			
			if (tail != null) {
				tail.rlink = null;
			} else {
				head = null;
			}
			return item;
		}
	}
	//display
	public void display() {
		for (Node n = head; n != null; n = n.rlink) {
			System.out.print(n.data + " ");
		}
	}
}
class Node {
	int data;
	Node llink;
	Node rlink;
	
	public Node(int data) {
		this.data = data;
		this.llink = null;
		this.rlink = null;
	}
}
public class Deque_1 {

	public static void main(String[] args) {
		DequeType deque = new DequeType();
		
		deque.add_head(10);
		deque.add_head(20);
		deque.add_head(30);
		
		System.out.println("삽입완료");
		deque.display();
		System.out.println();
		
		System.out.println("맨앞 삭제 : " + deque.delete_front());
		deque.display();
		System.out.println();
		System.out.println("맨뒤 삭제 : " + deque.delete_tail());
		deque.display();
		System.out.println();
		
		deque.add_tail(50);
		deque.add_tail(60);
		deque.add_tail(70);
		deque.add_head(1);
		
		System.out.println("삽입완료");
		deque.display();
		System.out.println();
		
		System.out.println("맨앞 삭제 : " + deque.delete_front());
		deque.display();
		System.out.println();
		System.out.println("맨뒤 삭제 : " + deque.delete_tail());
		deque.display();
		System.out.println();

	}

}

 

3. Deque 라이브러리 사용

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;

public class Deque_a {

	public static void main(String[] args) {
		
		Deque<Integer> LinkedDeque  = new LinkedList<Integer>();
		Deque<Integer> ArrayDeque = new ArrayDeque<Integer>();
		
		// Add at the last 
		LinkedDeque.add(1); 
        // Add at the first 
		LinkedDeque.addFirst(2); 
        // Add at the last 
		LinkedDeque.addLast(3); 
        // Add at the first 
		LinkedDeque.push(4); 
        // Add at the last 
		LinkedDeque.offer(5); 
        // Add at the first 
		LinkedDeque.offerFirst(6); 
        System.out.println(LinkedDeque + "\n"); 
  
        LinkedDeque.removeFirst(); 
        LinkedDeque.removeLast(); 
        System.out.println(LinkedDeque); 
        
		ArrayDeque.add(1); 
		ArrayDeque.addFirst(2); 
		ArrayDeque.addLast(3); 
		System.out.println(ArrayDeque);
        System.out.println(ArrayDeque.pop()); 
        System.out.println(ArrayDeque.poll()); 
        System.out.println(ArrayDeque.pollFirst()); 
        System.out.println(ArrayDeque.pollLast());
	}
}

라이브러리를 이용한 덱은 문서를 자세히 다시 봐야겠다.