队列与栈

来源:互联网 发布:http jd2017b.123js 编辑:程序博客网 时间:2024/05/22 02:17

经常会听到队列与栈,其实队列与栈本身的规则是非常简单的,队遵循的基本原则是先进先出,就是你先进入的就先出去,比如入队的顺序是1,2,3,4,5,那么出队顺序也是1,2,3,4,5.可以认为是一个管子,这边进去另一边出去。而栈就不是这样了,就是一个口子管子,出入都从这一个口子进行出入。同样如何入栈顺序是1,2,3,4,5那么出栈就是5,4,3,2,1 。因为只能一个一个的出栈而第一个入栈的1 已经被压栈到最下面了。所以最后一个出栈。从概念上讲他们都很好理解但是实际应用中他们两者的结合会有很多种变化。而很多软件考试也考这种变化非常多。


先看个特殊的队列---循环队列

所谓循环队列就是头与尾连起来了就形成了一个圈,如下



循环队列的特点就是从一个方向走走就又回来了。

循环队列的空判断依据是 :head = tail   头与尾相等了。而我们发现循环队列满的时候也是head=tail ,所以为了判断循环队列满的情况一般的解决方案会有2种,一种就是记录到底是堆满还是队空,这个比较麻烦,而更多的采取的是另外一种方式就是再这个循环队列里面少存一个元素。比如有循环队列有5个空间我最多只存4个。这时候就可以判断了,因为我们发现只要是尾指针的下一个元素是头指针就代表队满。就是尾指针(tail + 1) % size  ,size代表循环队列的总数,比如当前尾指针指到了4,那么(4+1) %5 结果等0了。这个时候就代表队列已经满了。如果告诉你了队头,并且告诉我们目前存了几个数据,让求队尾指针的时候,值得咱们注意的一点就是我们需要对总数size取余修正,因为比如我们头指向4  尾在3  那么4+3 已经大于5了,所以需要我们进行修正,修正这个结果。


下面我们看看这个队列与栈的组合,首先看看栈的变化形式。

比如:元素按照a,b,c的次序进行入栈,可能的出栈的序列会是那些。

如果你知道c,b,a那么你对栈的认识还是比较肤浅的,虽然栈后进先出或者说先进后出,但是a入栈了可以立即出栈啊所以有多种形式。出栈可以a,b,c, ;b,a,c,   等所以已某种形式入栈出栈是多种的。

下面再说一个复杂点的结合了栈与队列的情况。





原创粉丝点击