1、说明如何用两个栈来实现一个队列,并分析有关队列操作的运行时间。
answer:栈是先进后出,而队列是先进先出,一种自然的想法是,用一个栈来存储队列的元素,入队就和如栈一样; 出队的时候先将这个栈的元素依次压出另一个栈内,然后将栈顶元素(即队首)弹出,然后再依次倒回原先的栈内。 这样入队为O(1),出队为O(n)。仔细想想,并不需要每次都将当前所有元素在两个栈内倒来倒去, 只需要入队用一个栈,出队用另一个栈: 入队操作即在第一个栈上执行入栈;出队操作时,若第二个栈不为空,则在第二个栈上执行出栈, 若第二个栈为空,则将第一个栈内的元素依次全部压入第二个栈内。这样入队出队操作都为O(1)的复杂度。
2、说明如何用两个队列来实现一个栈,并分析有关栈操作的运行时间。
answer:一种自然的想法,类似于上一题,用一个队存储,另一个队列作为临时空间。入栈时就向第一个队列中插入元素; 出栈时,先将第一个队列中除队尾(栈顶)的元素依次出队后进入第二个队列,然后将队尾(栈顶)元素出队, 再将第二个队列中的所有元素依次出队后进入第一个队列。这样做的话,入栈是O(1),出栈是O(n)。 其实出栈操作时完全不需要将第二个队列的元素复制回第一个队列,直接将第二个队列作为入栈时的队列即可。两个队列交替作为存储队列。