数据结构和算法之栈和队列二:栈的压入,弹出序列

Posted GoNewLife

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构和算法之栈和队列二:栈的压入,弹出序列相关的知识,希望对你有一定的参考价值。

  当时我在学习这个的时候也是非常不理解这个问题,一个栈的压入和弹出序列的判断一看不就知道了么,还去判断干嘛。只要符合后进先出的规则就行。但是我在这里简单说一下这个压入和弹出序列是怎么回事。就是我们给定假设的两个序列,一个为压入序列,一个为弹出序列。然后我们再通过一个辅助的栈,把压入序列的数据一个一个push()进入临时的辅助栈中,如果栈顶元素刚好和弹出序列的数据一样,那么我们就弹出,如果不一样我们就将压入序列的数据继续压入临时栈中,直到到达序列结束。如果压入序列结束,临时栈全部数据弹出那么就是一个弹出压入或者弹出序列。直接上图理解一下:

                                 

  代码如下:

public boolean isPopOrder(int arr1[],int arr2[]){
    //判断两个序列是否有空序列
    if(arr1.length == 0 || arr2.length == 0){
          return false;
    }
    //创建一个临时的辅助栈
    Stack<Integer> s = new Stack<>();
    //将数据压入栈中并进行比较
    for(int i = 0,j = 0;i < arr1.length;){
         s.push(arr1[i]);
         //判断栈顶元素是否和弹出序列一致
         while(s.size() > 0 && s.peek() == arr2[j]){
              s.pop();
              j++;
         }
    }
    return  s.isEmpty();
}

   我上边的代码使用的数组来对序列进行实现。arr1表示压入序列,arr2表示弹出序列。关键我们需要抓住的是在压入时进行循环的弹出比较就行了,借助于一个临时栈对算法进行实现。

以上是关于数据结构和算法之栈和队列二:栈的压入,弹出序列的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer之栈的压入弹出序列

剑指Offer之栈的压入弹出序列

剑指offer(三十六)之栈的压入弹出序列

剑指offer之栈的压入弹出序列

剑指offer之栈的压入弹出序列(利用辅助栈)

剑指offer:栈的压入弹出序列