判断栈的出栈顺序是不是正确

判断栈的出栈顺序是否正确

一、问题描述

     两个数组pPush和pPop分别存储了压栈序列和出栈序列,如何判断出栈序列是否正确,假设元素不重复。

二、举例:

    pPush中序列为:[5   9   1   8    13     4   2    1]

    那么给出一个出栈序列pPop[8   4   1   2   13  1   9   5],这个出栈序列是正确的。

    给出一个pPop:[8   4   1   2   13   5   9   1]这个出栈序列就是错误的,因为8第一个出栈,说明栈中尚有5  9  1三个元素,

    它们的出栈顺序必须满足 1  9  5 这个顺序,但是出栈队列中确实5  9  1 的顺序出栈。

三、算法思路:

     需要用到一个辅助栈stackData来存储尚未出栈的元素

     1、对出栈序列进行遍历,第一个元素是8,说明前面已经存过5  9  1,将它存入辅助栈中

     stackData:  1  5  9】   (“】”代表开口方向向左)  

 

     2、遍历第二个元素是4,它不是stackData中的第一个top元素1,说明新压入了元素,那么容易知道4之前的元素13已经被压入栈中,所以将13压入辅助栈

     stackData:   13  1  5  9】

     3、遍历第三个元素是1,不是stackData中的第一个top元素13,说明新压入了元素,那么容易知道1之前的元素2已经被压入栈中,所以将2压入辅助栈

     stackData:   2   13  1  5  9】

         也要注意到,此时1已经到达了压栈序列的最后一个元素,那么容易知道最后的出栈序列必须和 stackData的出栈序列一致,否则可以判断出栈序列不正确

     

       根据前面的步骤我们可以得到伪代码如下:

四、伪代码

    int j = -1;

       for遍历出栈序列           

             if  (辅助栈空 || 辅助栈top元素不等于pPop[i] //说明要向辅助栈中存元素)

                    while  (pPush[++j] 不等于pPop[i])

                     pPush[j]压入辅助栈  

             else //辅助栈top元素等于pPop[i],要弹出元素了

                  辅助栈弹出一个元素

      

  五、c++代码