您的位置:首页 > 其它

用两个栈如何实现队列?

2016-12-05 15:26 190 查看
查看原文:http://www.wyblog.cn/2016/12/05/%e7%94%a8%e4%b8%a4%e4%b8%aa%e6%a0%88%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e9%98%9f%e5%88%97%ef%bc%9f/
在网上无意间看到了这个问题,记录一下。
首先,回忆一下栈与队列的区别。栈,就是后进先出,而队列,则是先进先出。可见,栈与队列只是在弹出数据的顺序上有区别。这也正是为什么要用两个栈来做队列。
假如有A、B两个栈,栈既然是后进先出,那么最先进栈数据的就会在栈A的底部,如何让它能先出栈?这就需要使用第二个栈B,如果将栈A的元素不断弹出,再压入栈B里,是否栈A底层的元素就跑到栈B上层了?
可以看出,入队操作只需将数据压入栈A里,出队操作则只需直接弹出一个栈B元素就行了。

根据以上原理,就有两个方案。
1. 入队操作就是将数据压入栈A。出队操作时,先将栈A的数据全部弹出并压入栈B,然后从栈B里弹出一个元素,则为出队的元素。
以上方案问题就在出队操作上,需要在两个堆栈之间倒数据。第二种方案就考虑到,如果是连续多次出队操作,那么我们将栈B的元素倒回栈A里的操作完全是多余的。所以,只改变出队操作方案。
2. 入队就是将数据压入栈A。出队时,检查栈B是否为空,如果不为空,那么就直接弹出数据,如果为空,那么就该再把栈A里的数据给倒入进栈B了。这样,就极大的减少了倒栈的操作次数。

最后,最重要的,是要考虑异常情况。当栈为空时,进行出队操作就会导致异常出现,所以,程序里一定要进行检测,这是基本素质!查看原文:http://www.wyblog.cn/2016/12/05/%e7%94%a8%e4%b8%a4%e4%b8%aa%e6%a0%88%e5%a6%82%e4%bd%95%e5%ae%9e%e7%8e%b0%e9%98%9f%e5%88%97%ef%bc%9f/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: