火车站车厢编组问题
【问题描述】
某城市有一个火车站,铁轨铺设如图所示。有n节车厢从A方向驶入车站,按进站顺序编号为1-n。你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。要求必须自己建立栈,不准许使用各种语言编译环境中的栈类型,比如C++中的stack等等。
解题思路:入栈顺序是固定的,则我们可以根据出栈的顺序来判断该出栈顺序是否存在。从出栈顺序的第一个元素开始遍历,入栈元素开始逐个入栈,每入栈一个元素就判断栈顶元素是否与出栈顺序的元素是否相等,相等则将该元素入栈后出栈,从第二个元素开始,将出栈元素与栈顶元素比较,相等则出栈后进入下一层循环,直到栈空且出栈元素完成遍历则判定该出栈序列存在;不相等就继续入栈再比较,若入栈元素无该出栈元素则可以判定该出栈顺序不存在。
举例分析:入栈顺序12345,出栈顺序54321,第一个出栈遍历元素为5,则开始入栈,直到栈顶元素为5,将5出栈,栈顶元素为4,第二个出栈遍历元素为4,出栈,栈顶元素为3,第三个出栈遍历元素为3,出栈,栈顶元素为2,第四个出栈遍历元素为2,出栈,栈顶元素为1,最后一个遍历元素为1,出栈,栈空且遍历完成,判定该出栈顺序存在。
完整代码:
public static void Solution(int n,int[] out_stack){
int[] in_stack = new int[n]; //创建存放入栈序列的数组
int[] stack = new int[in_stack.length]; //创建栈
int top = 0; //栈指针 以top=-1表示栈空
for (int i = 0; i < in_stack.length ; i++) {
in_stack[i] = i+1;
}
int out_stack_index = 0;
for (int j : in_stack) { //遍历出栈元素
stack[top] = j;
while (top != -1 && stack[top] == out_stack[out_stack_index]) {
top--;
out_stack_index++;
}
top++;
}
if (top == 0) { //栈空则表示该输出串存在
System.out.println("Yes");
}
else{
System.out.println("No");
}
}
测试类:
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt(); //输入序列个数
int[] out_stack = new int[n]; //创建存放出栈序列的数组
for (int i = 0; i < out_stack.length; i++) {
out_stack[i] = in.nextInt();
}
Solution(n,out_stack);
}
样例输入输出:
5
1 2 3 4 5
Yes
4
1 2 4 3
Yes
5
5 3 1 2 4
No