火车调度

题目


题目描述:

粗心的塔学长现在是火车站的调度员,看看现在的惨状吧,列车车厢的顺序竟然完全是乱的!为避免塔学长登上明天的UC头条,车站划分给塔塔一段如图所示的铁路,你能帮助塔塔把车厢的顺序调整好吗?

其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:列车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。

列车由编号依次为{1, 2, ..., n}的n节车厢组成。塔塔希望知道,按照以上交通规则,这些车厢能否以{a1, a2, ..., an}的次序,重新排列后从B端驶出。如果可行,应该以怎样的次序操作?

输入:

共两行。 
第一行为两个整数n,m。 
第二行为以空格分隔的n个整数,保证为{1, 2, …, n}的一个排列,表示待判断可行性的驶出序列{a1,a2,…,an}。

输出:
若驶出序列可行,则输出操作序列,其中push表示车厢从A进入S,pop表示车厢从S进入B,每个操作占一行。
若不可行,则输出“震惊!昨天小汤河火车站竟然。。。”。
样例输入
5 2
1 2 3 5 4
样例输出
push
pop
push
pop
push
pop
push
push
pop
pop


思路


这就是一个栈的程序实现问题。

用队列来储存输出的顺序。


代码


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    	Scanner scan=new Scanner(System.in);
    	ArrayList<String> queue=new ArrayList();
    	LinkedList<Integer> temp=new LinkedList();
    	LinkedList<Integer> stack_begin=new LinkedList();
    	String out="pop";
    	String in="push";
    	String output="震惊!昨天小汤河火车站竟然。。。";
    	int n=scan.nextInt();
    	int m=scan.nextInt();
    	int[] end=new int[n];
    	for(int i=0;i<n;i++) {
    		end[i]=scan.nextInt();
    	}
    	for(int i=1;i<=n;i++) {
    		stack_begin.add(i);
    	}
    	int count=0;
    	int a=-1;
    	boolean isok = true;
    	for(int i=0;i<n;i++) {
    		if(temp.isEmpty()) {
    			a=stack_begin.getFirst();
    			while(a!=end[i]) {                //A不等于B 入临时栈
    				temp.add(stack_begin.removeFirst());
    				queue.add(in);
    				if(temp.size()>m) {        //中间的临时栈爆了
    					isok=false;
    					break;
    				}
    				if(!stack_begin.isEmpty()) {
        				a=stack_begin.getFirst();}
        				else {
        					isok=false;break;
        				}
    			}
    			if(a==end[i]) {
    				if(temp.size()==m) {    //临时栈满了 A中元素无法进入B
    					isok=false;break;
    				}else {                //从A直接到B
    					stack_begin.removeFirst();
    					queue.add(in);
    					queue.add(out);
    				}
    			}else {
    				isok=false;
    				break;
    			}
    		}else {
    			if(temp.getLast()==end[i]) {
    			temp.removeLast();
    			queue.add(out);
    			}else {
    				a=stack_begin.getFirst();
        			while(a!=end[i]) {
        				temp.add(stack_begin.removeFirst());
        				queue.add(in);
        				if(temp.size()>m) {
        					isok=false;
        					break;
        				}
        				if(!stack_begin.isEmpty()) {
        				a=stack_begin.getFirst();}
        				else {
        					isok=false;break;
        				}
        			}
        			if(a==end[i]) {
        				if(temp.size()==m) {
        					isok=false;break;
        				}else {
        					stack_begin.removeFirst();
        					queue.add(in);
        					queue.add(out);
        				}
        			}else {
        				isok=false;
        				break;
        			}
    				
    			}
    			
    		}
    	}
    	if(isok) {
    		for(int i=0;i<queue.size();i++) {
    			System.out.println(queue.get(i));
    		}
    	}
    	else {
    		System.out.println(output);
    	}
    	
    	
    }  
    
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值