欢迎使用CSDN-markdown编辑器

来源:互联网 发布:大数据时代财务管理 编辑:程序博客网 时间:2024/06/06 05:46

如何使用两个栈来实现队列
算法导论第十章课后思考题目

  今天拿到了刚买的算法导论一书,开始学习数据结构,虽然之前大学期间也上过数据结构的课程,但是真正学习到的东西确实只有一点点皮毛。下面开始我们自己的方法,如何使用两个栈来模拟实现一个队列呢。栈具有先进后出的功能,队列具有先进先出的功能。 定义两个栈分别为s1,s2
  方法一:
  在这里我们定义s1来作为存储区,s2来作为临时缓冲区。第一种方法就是将所有元素入队是全部压入s1,然后将s1中的元素全部倒入到栈s2中。然后把s2的栈顶元素出栈.如果栈s2不为空,就把栈s2中的元素再次倒入到栈s1中,如果此时s1不为空的话就把s1的元素再次倒入到s2中。通过这样循环往复直到将所有元素出队。同时也应该考虑到一些边界情况。例如,当s2为空时,显然是不能进行出栈的操作的。当s1s2中完全没有元素,也不能进行出栈操作。
  方法二:
  方法二是对方法一的一个变种,我们仔细分析一下方法一的操作,对于s1s2的数据进行了很多次的入栈和出栈操作。当我们从栈s2 向栈s1中倒入数据时,我们需要考虑一下对于每次栈s2栈底的元素是不需要进行来回倒数了。
  方法三: 
  方法三是另外一种方法。这种方法是这样的,首先将入队的元素全部放入栈s1中。如果s2不为空的话,,将s2的栈顶数据进行出栈。如果s2为空的话就将s1所有的数据倒入到栈s2中。
  举个例子:
  s1从栈底到栈顶依次为1、2、3,s2为空,此时做出队操作:把s1倒入s2,则s2从栈底到栈顶依次为3、2、1,将栈顶的1弹出,之后不用把s2倒回s1。之后,如果入队两个元素,如4、5,则将其压入s1;如果此时出队一个元素,由于s2不为空,则直接弹出栈顶的2;再出队,由于s2还不为空,则直接弹出栈顶的3;再次出队,由于s2为空了,将s1的元素(依次为5、4)倒入s2,再弹出栈顶的4,再出队,由于s2又不为空了,直接弹出5。一切正常。