2
是否可以在一个阵列中以O(1)推送/弹出时间实现三个堆栈?
使用一个固定大小的数组可以有效地实现两个堆栈:堆栈#1从左端开始向右增长,而堆栈#2从右端开始向左增长。三个堆栈是否可能相同? 更具体地说,在以下条件下是否可以实现三个堆栈: 您有一个固定大小的数组,可以容纳N个对象。 只要这三个堆栈大小之和小于N,push()就不会失败。 push()和pop()操作都应花费O(1)时间。 除了数组之外,您只能使用O(1)额外的空间。 这里是指那些解决方案的例子并不满足这些要求: 将数组拆分为3个固定部分,并将每个部分用于堆栈(违反2)。 与上述类似,但堆栈之间有可移动的边界(违反3)。 基于简单链表的实现(违反4)。 即使它们不能完全满足所有条件(1)-(4),我也会接受非平凡的算法或不可能证明,例如,推/弹出需要O(1)摊销时间的算法,或者额外的内存小于O(N),例如O(log N)。或者说不可能的证据表明,例如,每个推送/弹出操作访问少于5个数组元素是不可能的。