使用2个堆栈实现队列,具有恒定的时间复杂性



我想知道是否可以使用两个堆栈来实现一个队列,这样每个队列操作都需要分摊恒定的时间。

class QQ: 
def __init__(self): 
self.s = [] 
self.ss = [] 
def enque(self, val): 
self.s.append(val) 
def deque(self): 
if not self.s and not self.ss: return None 
if not self.ss: 
while self.s: 
self.ss.append(self.s.pop()) 
return self.ss.pop() 

当我们将s的元素弹出到ss中时,第二堆栈ss以相反的顺序保持第一堆栈s的内容。反向堆栈只是一个队列。每当ss为空时,我们将s中的所有元素加载到ss中。如果它不是空的,我们只从中deque一个元素。

由于我们只移动了一次enqueing,而从长远来看,dequeing只移动了两次,因此时间复杂性是摊销常数

我们使用两个带有标签的堆栈"前面的";以及";返回";。

在前端堆栈中,我们应该使用size和clear方法,size返回堆栈的指针,clear将指针设置为0。

对于enqueue(),我们应该将新元素推送到前堆栈。因此时间复杂度将为O(1)

对于dequeue(),如果后堆栈是空的,我们应该用前堆栈中的元素填充它,对于前堆栈内的每个元素,我们应该调用pop()函数,然后使用push()函数将其插入后堆栈,因为我们知道前堆栈的大小(并且它是恒定的(,pop和push函数具有O(1)的时间复杂度,出列的整个复杂度将是CCD_ 17。

对于size(),它将返回前堆栈和后堆栈size()的总和。对于isEmpty(),它应该返回大小是否等于零。

最新更新