1、问题描述:两个序列,第一个是压栈顺序,要判断第二个序列是不是该压栈顺序的某一个出栈顺序;
2、分析
为了更加清晰的结束算法逻辑,举例如下:
【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。
3、代码
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA.length==0||popA.length==0){
return false;
}
Stack<Integer> s = new Stack<>();
//标识弹出序列的当前位置
int popIdx=0;
for(int i=0;i<pushA.length;i++){
s.push(pushA[i]);
//如果栈不空,且栈顶元素等于弹出序列当前标识位置
while(!s.empty()&&s.peek()==popA[popIdx]){
//遇到和当前标识弹出序列相同栈顶,就出栈
s.pop();
//弹出序列后移一位
popIdx++;
}
}
return s.empty();//最后栈空,说明这种弹出序列是压栈的一种出栈方式,否则不是
}
}