问题描述:某城市有一个火车站。铁轨铺设如图所示。有N节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是让他们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,可以借助中转站C,对于每个车,一旦进入c就不能再进入A,一旦c进入B就不能回到c。
测试数据
输入样例:
5
5 4 3 2 1
6
6 5 4 3 2 1
5
5 4 1 2 3
输出样例:
Yes
Yes
No
解:
public class Main {
public static void main(String[] args) {
Scanner out = new Scanner(System.in);
Stack<Integer> s = new Stack<>();
int n = out.nextInt();// 车辆数
int[] target = new int[n + 1];// 驶出队列
for (int i = 1; i <= n; i++) {
target[i] = out.nextInt();// 驶出时的顺序 (驶入时的顺序是:1、2、3...)
}
int a = 1;// a是驶出车号的下标
int b = 1;// b是驶入车号
boolean ok = true;
out.close();
while (a <= n) {
if (b == target[a]) {// 两边头车号一样时
a++;
b++;
} else if (!s.isEmpty() && (s.peek() == target[a])) { // 栈头车号与驶出车号一样时
s.pop();
a++;
} else if (b <= n) {// 驶入队列还有车时
s.push(b);
b++;
} else {
ok = false;
break;
}
}
if (ok) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}