๋ฑ(Deque)

1 minute read

๋ฑ(Deque)

Deque์ด๋ž€?

Deque(Double Ended Queue) ๋ผ๋Š”๋œป์œผ๋กœ ์–‘์ชฝ๋์—์„œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์ „๋ถ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

Deque์˜ ์„ฑ์งˆ

  • ์›์†Œ์˜ ์ถ”๊ฐ€๊ฐ€ O(1)
  • ์›์†Œ์˜ ์ œ๊ฑฐ๊ฐ€ O(1)
  • ์ œ์ผ ์•ž/๋’ค์˜ ์›์†Œ ํ™•์ธ์ด O(1)
  • ์ œ์ผ ์•ž/๋’ค๊ฐ€ ์•„๋‹Œ ๋‚˜๋จธ์ง€ ์›์†Œ๋“ค์˜ ํ™•์ธ/ ๋ณ€๊ฒฝ์ด ์›์น™์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅ

Deque ๊ตฌํ˜„ํ•˜๊ธฐ

array๋กœ ๊ตฌํ˜„ํ•œ Queue
head์™€ tail์˜ ์‹œ์ž‘์ ์„ ์ค‘๊ฐ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

class Deque {
    private final int MAX = 1000005;
    private final int[] data = new int[2 * MAX + 1];
    private int head = MAX;
    private int tail = MAX;

    boolean offerFirst(int e) {
        data[--head] = e;
        return true;
    }

    boolean offerLast(int e) {
        data[tail++] = e;
        return true;
    }

    int pollFirst() {
        return data[head++];
    }

    int pollLast() {
        return data[--tail];
    }

    int peekFirst() {
        return data[head];
    }

    int peekLast() {
        return data[tail - 1];
    }

    int size() {
        return tail - head;
    }

    boolean isEmpty() {
        return size() == 0;
    }
}

LinkedList๋กœ ๊ตฌํ˜„ํ•œ Deque

class Deque<E> {
    private Node<E> head;
    private Node<E> tail;
    private int size = 0;

    private static class Node<E> {
        E data;
        Node<E> previous;
        Node<E> next;

        Node(E data) {
            this.data = data;
        }
    }

    boolean offerFirst(E e) {
        Node<E> newNode = new Node<>(e);
        newNode.next = head;
        if (tail == null) {
            tail = newNode;
        } else {
            head.previous = newNode;
        }
        head = newNode;
        size++;
        return true;
    }

    boolean offerLast(E e) {
        Node<E> newNode = new Node<>(e);
        newNode.previous = tail;
        if (head == null) {
            head = newNode;
        } else {
            tail.next = newNode;
        }
        tail = newNode;
        size++;
        return true;
    }

    E pollFirst() {
        E e = head.data;

        Node<E> nextNode = head.next;

        head.data = null;
        head.next = null;


        head = nextNode;
        size--;

        if (size == 0) {
            tail = null;
            head = null;
        }
        return e;
    }

    E pollLast() {
        E e = tail.data;

        Node<E> previousNode = tail.previous;

        tail.data = null;
        tail.previous = null;

        tail = previousNode;
        size--;

        if (size == 0) {
            tail = null;
            head = null;
        }
        return e;
    }

    E peekFirst() {
        Node<E> n = head;
        return n == null ? null : n.data;
    }

    E peekLast() {
        Node<E> n = tail;
        return n == null ? null : n.data;
    }

    int size() {
        return size;
    }

    boolean isEmpty() {
        return size <= 0;
    }
}

java์˜ Queue์—๋Š” offerFirst, offerLast, pollFirst, pollLast, peekFirst, peekLast ์™ธ์—๋„
addFirst, addLast, remove, removeLast, getFirst, getLast ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.
java์˜ deque interface์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋น„๊ตํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
image

offer, poll, peek ๊ณ„์—ด์€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€์•Š๊ณ 
add, remove, get, element ๊ณ„์—ด์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.