题目
题目描述:
粗心的塔学长现在是火车站的调度员,看看现在的惨状吧,列车车厢的顺序竟然完全是乱的!为避免塔学长登上明天的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);
}
}
}