堆栈与队列的关系

如何用两个堆栈模拟实现一个队列? 如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证的队列容量是多少

容量为2n+1只能实现一种固定入队出队顺序的队列。

先将第1~n个元素全入m栈,之后全pop并push到n栈,此时n栈由顶至底装载的是第1到第n共n个元素。将n栈中所有元素pop,得到的出栈序列即为前n个元素的出队顺序。

然后,将n+1个元素全部压进m栈,从顶至底的元素顺序为第2n+1到第n+1,将前n个元素全部压入栈n,此时m栈只有一个序号为n+1的元素,而n栈从顶至底的元素序号为n+2~2n+1。先将m栈的元素弹出,之后弹出n栈所有元素。最终,得到了从第1至第2n+1个元素的正确出队顺序。

这种情况下,在前2n+1个元素未完全被处理前,是不能进行入队操作的。

第二种容量为n+1能更好得实现队列。普通情况下(保证栈m总的元素个数始终<=n),元素被push进m栈,只要有出队操作,m栈元素全部倒进n栈,并对n栈进行pop。这样可以很好得模拟容量为n的队列。

极端情况(容量为n+1),此时n栈满,m栈有一个元素,此时必须先对m栈进行pop也就是只能进行出队操作。之后在m栈元素个数<=n的情况下依旧可以自由得进行入队出队操作。

你可能感兴趣的:(数据结构)