数据结构和算法之栈和队列二:栈的压入,弹出序列
当时我在学习这个的时候也是非常不理解这个问题,一个栈的压入和弹出序列的判断一看不就知道了么,还去判断干嘛。只要符合后进先出的规则就行。但是我在这里简单说一下这个压入和弹出序列是怎么回事。就是我们给定假设的两个序列,一个为压入序列,一个为弹出序列。然后我们再通过一个辅助的栈,把压入序列的数据一个一个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表示弹出序列。关键我们需要抓住的是在压入时进行循环的弹出比较就行了,借助于一个临时栈对算法进行实现。