递归思路(java):
1.用两个指针指向最新的可入栈元素和目前想要从栈获取的元素;
2.每次尝试获取目标元素,成功则出栈并更新目标元素继续获取,失败则纳入可入栈元素并继续尝试获取当前目标元素
3.目标元素全部获取,则返回true
import java.util.Stack;
//判断出栈序列是否合法
public class Solution {
static int p1=0,p2=0;//p1指向最新的可入栈元素,p2指向想要从栈中获取的元素
static Stack<Integer> s=new Stack();
public boolean IsPopOrder(int [] pushA,int [] popA) {
return fun(pushA,popA);
}
public boolean fun(int[] PA,int[] PB){
//如果栈为空,但还有想要取得的元素,则将p1所指入栈,并尝试获取p2所指
if(s.size()==0 && p2<=PB.length-1){
s.push(PA[p1]);
p1++;
System.out.println("入栈:"+s.peek()+" "+s);
return fun(PA,PB);
}
//如果可以取得该元素 即p2所指
if(PB[p2]==s.peek()){
int ss=s.peek();
s.pop();
System.out.println("出栈:"+ss+" "+s.toString());
//如果后面还有待取元素,尝试获取
if(p2<=PB.length-2){
p2++;
return fun(PA,PB);
}
//如果当前是最后一个元素,结束,合法
if(p2==PB.length-1){
return true;
}
}
//如果无法取得该元素
if(PB[p2]!=s.peek()){
//如果已经没有可取元素,直接返回非法
if(p1==PA.length)return false;
s.push(PA[p1]);
System.out.println("入栈:"+s.peek()+" "+s);
p1++;
return fun(PA,PB);
}
return false;
}
}
京公网安备 11010502036488号