1670. Design Front Middle Back Queue
class FrontMiddleBackQueue (object ):
def __init__ (self ):
self .left = collections .deque ()
self .right = collections .deque ()
def balance (self ):
if len (self .left ) > len (self .right ):
self .right .appendleft (self .left .pop ())
elif len (self .right ) > len (self .left ) + 1 :
self .left .append (self .right .popleft ())
def pushFront (self , val ):
"""
:type val: int
:rtype: None
"""
self .left .appendleft (val )
self .balance ()
def pushMiddle (self , val ):
"""
:type val: int
:rtype: None
"""
if len (self .left ) < len (self .right ):
self .left .append (val )
else :
self .right .appendleft (val )
def pushBack (self , val ):
"""
:type val: int
:rtype: None
"""
self .right .append (val )
self .balance ()
def popFront (self ):
"""
:rtype: int
"""
if not self .right :
return - 1
if self .left :
ans = self .left .popleft ()
else :
ans = self .right .popleft ()
self .balance ()
return ans
def popMiddle (self ):
"""
:rtype: int
"""
if not self .right :
return - 1
if len (self .left ) == len (self .right ):
return self .left .pop ()
return self .right .popleft ()
def popBack (self ):
"""
:rtype: int
"""
if not self .right :
return - 1
ans = self .right .pop ()
self .balance ()
return ans
# Your FrontMiddleBackQueue object will be instantiated and called as such:
# obj = FrontMiddleBackQueue()
# obj.pushFront(val)
# obj.pushMiddle(val)
# obj.pushBack(val)
# param_4 = obj.popFront()
# param_5 = obj.popMiddle()
# param_6 = obj.popBack()