题目描述:某城市有一个火车站,铁轨铺设如图所示。有n节车厢从A方向驶入车站,按进站顺序编号1~n。现让这些火车按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,可以借助中转站C。C是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择:A→C和C→B。请编程判断判断:按给定的出站顺序,火车能否出站
package collection;
import java.util.*;
/*
题目复述:对于从a口,按照123456...顺序进入的火车,能否按照给定的顺序从b中驶出;其中c是充当一个中转站,原则是先进后出
*/
public class shed {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
List l = Arrays.asList(3,2,1,4,5);
list.addAll(l);
System.out.println(train(5,list));
}
public static boolean train(int n, ArrayList<Integer> enter){
/*
输入:n 火车节数;enter:给定的出站序列
输出:火车能否以给定的出站序列出站
*/
boolean result = true;
int a = 1;int b = 0;
Stack <Integer> c = new Stack<>();//初始化一个栈,相当于题目中的c
while (b<n){
if (a == enter.get(b)){//a方向的列车直接与目标一致
a+=1;//跳过c 直接进行
b+=1;}
else if (c.empty()==false && enter.get(b)==c.peek()){//c中列车序号是目标序号
b+=1;//出栈的时候 是此时的b 与栈顶元素相匹配 因此是b的指针在动
c.pop();
}
else if (a<=n){//都不满足 a中列车进入c中
c.push(a);
a+=1;//压栈的时候 是a在进入c 因此是a的指针在动
}
else{//以上条件均不符合 说明无法按照目标序列排序
result = false;
break;
}
}
return result;
}
}