양쪽에서 삽입과 삭제가 가능한 구조이며 스택과 큐 연산을 모두 지원하는 자료구조

Untitled 8.png

front와 rear에서 모두 삽입과 삭제가 가능하지만, 중간에서의 삽입과 삭제는 허용되지 않는다.

Deque ADT

덱의 구현

원형 큐에서 처럼 front와 rear를 두면, 삽입과 삭제에서의 시간복잡도를 O(1)으로 만들 수 있다.
원형 큐를 상속받아서 front와 rear를 사용하여 구현했다.

class CircularDeque(CircularQueue) :	          
    def __init__( self ) :		                  
        super().__init__()		                  

    def addRear( self, item ): self.enqueue(item )
    def deleteFront( self ): return self.dequeue()
    def getFront( self ): return self.peek()		
   
    def addFront( self, item ):			          
        if not self.isFull():
            self.items[self.front] = item        
            self.front = self.front - 1		      
            if self.front < 0 : self.front = MAX_QSIZE - 1

    def deleteRear( self ):			      
        if not self.isEmpty():
            item = self.items[self.rear]
            self.rear = self.rear - 1		
            if self.rear < 0 : self.rear = MAX_QSIZE - 1
            return item			     

    def getRear( self ):			 
        return self.items[self.rear]

테스트

dq = CircularDeque()		        
for i in range(9):			        
	if i%2==0 : dq.addRear(i)		
	else : dq.addFront(i)		    
dq.display()				        
for i in range(2): dq.deleteFront()	
for i in range(3): dq.deleteRear()	
dq.display()
for i in range(9,14): dq.addFront(i)
dq.display()
>>
[f=6,r=5] ==>  [7, 5, 3, 1, 0, 2, 4, 6, 8]
[f=8,r=2] ==>  [3, 1, 0, 2]
[f=3,r=2] ==>  [13, 12, 11, 10, 9, 3, 1, 0, 2]

python 에서의 deque

python의 기본 모듈이 collections에서 deque를 import해서 사용할 수 있다.
python collections.deque 참고