两个队列实现栈,两个栈实现队列详细解析

    栈和队列是两种常用的数据结构,他们的地城实现基本也就两种:数组和链表。数组是是将元素在内存中连续存放,链表是用指针来索引数据。具体请自行google,不是要讲的重点。

第一个问题:栈是一种先进后出的数据结构,如何用两个队列来实现栈的功能呢?

   要先符合栈的先进后出(后进先出),用一个队列是不行的,必需数量大于1。主要思想如下:

    假设有个一串数字a,b,c,d顺序入栈,出来的结果应该是d,c,b,a,有两个队列Q1,Q2,

    第一步:随便找一个空的队列Q1,将a放入到Q1,此时Q2中数据为空,Q1里面有a。

    第二步:找到空的队列Q2,将b放入,并将 Q1里面的值(a)全部输出,加入到Q2中,此时Q1为空,Q2里面有b,a。

    第三步:将c放入到空的队列Q1中,将Q2里面的值(b,a)全部输出,放入到Q1中,此时Q2里面值为空,Q1里面有c,b,a。

    ……

   不断循环就可以用两个队列实现一个栈的功能,给张图参考一下


主要点:需要将有值的队列里面的值输出放到新添加值的队列。

第二个问题: 队列是一种先进先出的数据结构,如何用两个栈来实现队列呢?

 要先符合队列的先进先出(后进后出),用一个栈是不行的,必需数量大于1。主要思想如下:

    假设有个一串数字a,b,c,d顺序进队列,出来的结果应该是a,b,c,d,有两个队列S1,S2,

    第一步:随便找一个空的栈S1,将a放入到S1,此时S2中数据为空,S1里面有a。

    第二步:找到空的队列S2,将b放入,并将 S1里面的值(a)全部弹出,加入到S2中,此时S1为空,S2里面有a,b。

    第三步:在c要添加进栈之前,将栈S2 中的数据弹出,放到S1中,看到S1中的值为b,a,见图第四步,将c放入到空的栈S2中,将S2里面的值(c)全部弹出,放入到S1中,此时S2里面值为空,S1里面有c,b,a。

    第四步:将S1中的值全部弹出,放到S2中,此时S1为空,S2里面有a,b,c。

    第五步:在将d要添加进栈之前,将S2中的值(a,b,c)全部弹出,放到 S1中,此时S2为空,S1中有(c,b,a),d入栈S2,弹出d放到 S1中,此时S2为空,S1里面有(d,c,b,a)。

第六步:将S1值全部弹出,放入到S2中,此时S1为空,S2有(a,b,c,d)。

           ……

   不断循环就可以用两个栈实现一个队列的功能,给张图参考一下


主要点:在添加值之前,需要将有值的栈里面的值先弹出来倒着,然后将新值拼接上去,再输出放到另外一个栈。

好了,实现完毕!

原文地址:https://mp.csdn.net/postedit/79787462


  • 12
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值