火车站车厢编组问题

火车站车厢编组问题
问题描述
某城市有一个火车站,铁轨铺设如图所示。有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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值