闲聊蓝桥杯JAVA - 铁轨

闲聊蓝桥杯JAVA - 铁轨

D:现在研究这道题,之前忽略掉的。

某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1~n。现让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车厢,你可以借助中转站C。在程序中输入车厢数目和出站的特定顺序,如果可以则输出Yes,否者输出No。

样例输入:
5
1 2 3 4 5
5
5 4 1 2 3
6
6 5 4 3 2 1

样例输出:
Yes
No
Yes

Z:这道题以前是做过的:

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int arrNum = input.nextInt();
        int[] arr = new int[arrNum];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = input.nextInt();
        }

        Stack<Integer> stack = new Stack<Integer>();
        int arrPoint = 0;
        for (int i = 1; i <= arrNum; i++) {
            stack.push(i);
            while(stack.size() > 0 && stack.peek() == arr[arrPoint]){
                stack.pop();
                arrPoint++;
            }
        }
        if(stack.size()==0){
            System.out.println("Yes");
        }else{
            System.out.println("No");
        }
    }

M:这里主要代码就是这一段,应该怎么理解呢?

        for (int i = 1; i <= arrNum; i++) {
            stack.push(i);
            while(stack.size() > 0 && stack.peek() == arr[arrPoint]){
                stack.pop();
                arrPoint++;
            }
        }

为什么每次循环都把i给push到stack呢?stack.push(i);

Z: i 代表的是一个编号,也就是说车厢的编号逐个押进stack中。

M:那这个while(stack.size() > 0 && stack.peek() == arr[arrPoint]){又有什么含义呢?

Z:当栈中你 最新压进去的东西 刚好等于输入的 列车编号第一位。那就把压进去的东西弹出来,指向列车编号的下一位。

这个时候还会重复当前的步骤,一直到不符合为止。

这种做法可能不太好理解,再形象一点描述就是。我现在面前有AB两串麻将:

1 2 3 4 5 6    和    6 5 4 3 2 1

现在我手上有一个空瓶子,接下来做以下操作:

将A串的第1个 数字1 放进瓶子里,看看瓶子 最上面的数字1 是否等于结果串 B串的第1个数字6,不相同,继续
将A串的第2个 数字2 放进瓶子里,看看瓶子 最上面的数字2 是否等于结果串 B串的第1个数字6,不相同,继续
将A串的第3个 数字3 放进瓶子里,看看瓶子 最上面的数字3 是否等于结果串 B串的第1个数字6,不相同,继续
...
将A串的第6个 数字6 放进瓶子里,看看瓶子 最上面的数字6 是否等于结果串 B串的第1个数字6,相同,
将瓶子最上面的数字6弹出,看看瓶子 最上面的数字5 是否等于结果串 B串的第2个数字5,相同,
将瓶子最上面的数字5弹出,看看瓶子 最上面的数字4 是否等于结果串 B串的第3个数字4,相同,
...
一旦 A串 为空,判断瓶子是否为空?是的话说明Yes,否则No。

M:总结一下,这题的重点就是对压栈排序的使用,每次压一个就进行栈和结果串的比对,最后判断是否能实现结果串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值