队列与栈之间的联系


当我们学栈或者队列的时候,也许有想过我能不能用另一个来实现对方,看似完全相反的性质,实际上确实可以通过某些方式来实现,但是可能看起来很没有意义,不过可以让我们对栈和队列的理解更进一步。



用栈实现队列


栈先进后出,而队列先进先出,想要用栈实现队列,一个栈是不够的,我们需要再创建一个栈,来实现数据互相导的过程。之后有数据的栈我简称为p1,没有数据的栈我简称为p2。
此时把p1的数据导入p2,再弹出p1的栈顶数据,如此往复,我们就把p1导入到p2了,而又因为栈的特性,先进后出,我们得到了队列的顺序,接下来我们只要出栈就算实现出队列了,代码如下



 


我们需要注意的是 我们以一个栈为空作为初始条件
,在满足这个条件的情况下,我们再while循环判断p1的栈是否为空,如果不为空那我就一直导到空栈,然后弹出自己。最后得到的p2就是队列的顺序,返回它的栈顶数据就好。

我们再在pop里调用peek,得到p2的栈顶数据,然后弹出p2,栈实现队列就成功了。核心代码就是peek和pop,其他的部分基本上只要调用原有的栈函数即可,代码如下。

创建:

 

判空及销毁:


队列实现栈



这个就比刚才的复杂一点了,由于队列的性质,我们无法导一次就确认最终顺序,我们还是创建两个队列,一个有数据,一个没数据,有数据的叫p1,没数据的叫p2。
我们首先把p1的数据导入p2并且只剩一个,然后弹出这一个,这就算实现出一次栈了,然后再重复刚才的操作,把p2的数据导回p1,再弹出,如此往复,用队列实现栈的效果。代码如下。




这一块就是核心代码,最重要的也是首先判断p1或者p2哪个不为空,然后把它的数据导入到另一个,自己只留一个,然后返回这一个,再弹出这一个。虽然效率低,但是确实用队列实现了栈。

其他函数的实现



核心搞定想必这些就是洒洒水了吧
 


环形队列问题



要想在这里面存数据,其实有两种方法,一个是链表一个是数组,不过链表有点麻烦,所以我说的是数组的方式,用数组呢,为了能判断满,所以多开一个空间出来,首先我们的结构体就四个成员,头尾,有效数据个数和我们的数组。


要想插入数组,我们需要判断它满了没,如果没满就正常插入,不过需要注意,如果这个数据就是最后一个,插入之后我们的尾再++,就会出现越界问题,所以我们要使用%来取余,确保它满了之后会绕回第一个节点而不是越界,这样插入才算完成。



而删除只需要头++即可,不过也要注意它是否也到最后一个位置了,所以我们也用取余来解决这个问题。

最后,返回头结点和尾结点,头结点正常返回即可,但是尾结点依然是需要注意上面的越界问题。

最后释放空间就大功告成了。

这个环形队列其实代码不是很难,但是需要注意到越界的问题,还得想通透它怎么解决就是这题的关键所在了。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值