双栈模拟队列

(1 min to read)

普通队列

支持push和pop操作

使用两个对顶栈stk1和stk2,push操作就直接加到stk2的尾部,pop操作就从stk1中弹出,如果stk1为空,就把stk2中的所有元素依次pop后push入stk1

双端队列

支持push_front、push_back、pop_front、pop_back操作

同样用两个对顶栈来实现,但是如果pop_front和pop_back操作交替进行,使用上面的方法就会TLE。考虑均摊的思想,如果在pop时该栈空了,就把另一个栈栈底的$\fracn2$​个元素push过去

摊还

考虑现在总共有n个物品,然后在m个位置可能会消耗物品,我们可以把这n个物品均分到这m个位置,如果某个位置的物品被消耗完说明物品数至少减少了$\frac1m$​,之后我们统计当前物品的数量后再进行均分。$T(n)=T(\frac{n(m-1)}{m})+O(n)$$T(n)=O(n)$