[DataStructure] Deque

1 minute read

python-version-3.7.1

Deque (덱)

  • 선형구조

  • Double-ended queue 의 약자

  • 양방향으로 데이터를 추가, 제거 가능


ds-02-queue



Method

  • push_front : front 에 임의의 데이터 추가

  • push_back : back 에 임의의 데이터 추가

  • pop_front : front 에 위치하는 데이터 꺼낸 뒤 해당값 반환

  • pop_back : back 에 위치하는 데이터 꺼낸 뒤 해당값 반환

  • get_front : front 에 위치하는 값 반환

  • get_back : back 에 위차하는 값 반환

  • get_size : 데이터 갯수 (사이즈) 반환

  • is_empty : 비어있는지 유무 반환 (bool)



Python Implementation Code

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None  # left = front side
        self.right = None  # right = back side
        

class Deque:
    def __init__(self):
        self.front = None
        self.back = None
        self.size = 0
        
    def push_front(self, data):
        new = Node(data)
        if not self.is_empty():
            new.right = self.front
            self.front.left = new
            self.front = new
        else:
            self.front = new
            self.back = new
        self.size += 1
    
    def push_back(self, data):
        new = Node(data)
        if not self.is_empty():
            new.left = self.back
            self.back.right = new
            self.back = new
        else:
            self.back = new
            self.front = new
        self.size += 1
    
    def pop_front(self):
        if not self.is_empty():
            tmp = self.front.data
            self.front = self.front.right
            if self.front: self.front.left = None
            self.size -= 1
            return tmp
        else:
            print('Empty Deque')
    
    def pop_back(self):
        if not self.is_empty():
            tmp = self.back.data
            self.back = self.back.left
            if self.back: self.back.right = None
            self.size -= 1
            return tmp
        else:
            print('Empty Deque')
    
    def get_front(self):
        if not self.is_empty():
            return self.front.data
        else:
            print('Empty Deque')
    
    def get_back(self):
        if not self.is_empty():
            return self.back.data
        else:
            print('Empty Deque')
    
    def get_size(self):
        return self.size
    
    def is_empty(self):
        return False if self.get_size() else True


push_front

ds-03-deque_push_front01


ds-03-deque_push_front02


ds-03-deque_push_front03


ds-03-deque_push_front04


pop_front

ds-03-deque_pop_front01


ds-03-deque_pop_front02


ds-03-deque_pop_front03


ds-03-deque_pop_front04


ds-03-deque_pop_front05


deque 의 front 가 self.front.right 를 참조하게 한 뒤,
self.front.left 가 None 을 참조하게 하여
이전 front 에 해당했던 node 는 제거된다. (해당 인스턴스를 참조하는 값이 없기 때문)
제거된 값을 반환할 수는 없기 때문에 제거하기전 tmpself.front.data 값을 저장해둔 뒤, 마지막에 반환한다.


self.front.left = Noneif self.front 조건문을 붙인 이유는
새로운 self.frontNone 이 될 수 있으며, 이 경우
None 에는 left 속성이 없어 에러가 발생할 수 있기 때문이다.

Leave a comment