如题。
原题可见这里
大致思路:
对照目标序列,查找驶来的火车车厢。相同就通过,不同则判断:
1、栈(站)里第一节车厢是需要的,就出栈,继续查找下一列车厢
2、栈里第一节车厢不是需要的,这节驶来的车厢就入站,判断下一节车厢。
当驶来的列车判断完毕,而栈内还有列车,则说明不可能完成这种序列。
代码:
public static void main(String[] args) throws Exception { int[] a,b; Stack<Integer> mystack=new Stack<Integer>(); a=new int[]{1,2,3,4,5,6,7,8,9}; //b=new int[]{1,2,6,7,5,4,8,3,9};//yes //b=new int[]{1,3,5,4,7,2,6,8,9};//no b=new int[]{9,8,7,6,5,4,3,2,1};//yes for (int i = 0,p=0;i<b.length; i++,p++) { if(p>=a.length||b[i]!=a[p])//如果驶来列车判断完毕,或者驶来列车编号不合要求 { //则判断栈里列车情况 if(!mystack.empty()&&mystack.peek()==b[i])//如果站里的列车符合要求,就出栈 { mystack.pop(); p--; } else//否则 { //如果已经没车来了 if(p>=a.length) { break;//结束 } //否则驶来的列车入站 mystack.push(a[p]); i--; } } } //以上判断完毕之后 //如果栈是空的,说明所有车厢都用上了,即可以实现。 if(mystack.empty()) { System.out.println("yes"); } //否则,站里剩的就是用不上的车厢,即无法实现 else { System.out.println("no"); } }
上面的逻辑有点乱。试试下面的:
思想: 栈里没有,且线上没有,就不可能。其余,操作就好。