我想知道是否可以使用两个堆栈来实现一个队列,这样每个队列操作都需要分摊恒定的时间。
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
一个元素。
由于我们只移动了一次enque
ing,而从长远来看,deque
ing只移动了两次,因此时间复杂性是摊销常数
我们使用两个带有标签的堆栈"前面的";以及";返回";。
在前端堆栈中,我们应该使用size和clear方法,size返回堆栈的指针,clear将指针设置为0。
对于enqueue()
,我们应该将新元素推送到前堆栈。因此时间复杂度将为O(1)
。
对于dequeue()
,如果后堆栈是空的,我们应该用前堆栈中的元素填充它,对于前堆栈内的每个元素,我们应该调用pop()
函数,然后使用push()
函数将其插入后堆栈,因为我们知道前堆栈的大小(并且它是恒定的(,pop和push函数具有O(1)
的时间复杂度,出列的整个复杂度将是CCD_ 17。
对于size()
,它将返回前堆栈和后堆栈size()
的总和。对于isEmpty()
,它应该返回大小是否等于零。