今天带来的是我数据结构实验二的两道题,这两道题都与栈与队列息息相关。现在先放上第一题:
7-1 列车厢调度
分数 300
全屏浏览题目
切换布局
作者 周强
单位 青岛大学
1 ====== <--移动方向
/
3 =====
\
2 ====== -->移动方向
大家或许在某些数据结构教材上见到过“列车厢调度问题”(当然没见过也不要紧)。今天,我们就来实际操作一下列车厢的调度。对照上方的ASCII字符图,问题描述如下:
有三条平行的列车轨道(1、2、3)以及1-3和2-3两段连接轨道。现有一列车厢停在1号轨道上,请利用两条连接轨道以及3号轨道,将车厢按照要求的顺序转移到2号轨道。规则是:
- 每次转移1节车厢;
- 处在1号轨道的车厢要么经过1-3连接道进入3号轨道(该操作记为"1->3"),要么经过两条连接轨道直接进入2号轨道(该操作记为"1->2");
- 一旦车厢进入2号轨道,就不可以再移出该轨道;
- 处在3号轨道的车厢,只能经过2-3连接道进入2号轨道(该操作记为"3->2");
- 显然,任何车厢不能穿过、跨越或绕过其它车厢进行移动。
对于给定的1号停车顺序,如果经过调度能够实现2号轨道要求的顺序,则给出操作序列;如果不能,就反问用户 Are(你) you(是) kidding(凯丁) me(么)?
输入格式:
两行由大写字母组成的非空字符串,第一行表示停在1号轨道上的车厢从左到右的顺序,第二行表示要求车厢停到2号轨道的进道顺序(输入样例1中第二行CBA
表示车厢在2号轨道的停放从左到右是ABC
,因为C
最先进入,所以在最右边)。两行字符串长度相同且不超过26(因为只有26个大写字母),每个字母表示一节车厢。题目保证同一行内的字母不重复且两行的字母集相同。
输出格式:
如果能够成功调度,给出最短的操作序列,每个操作占一行。所谓“最短”,即如果1->2可以完成的调度,就不要通过1->3和3->2来实现。如果不能调度,输出 "Are you kidding me?"
输入样例1:
ABC
CBA
输出样例1:
1->3
1->3
1->2
3->2
3->2
输入样例2:
ABC
CAB
输出样例2:
Are you kidding me?
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
先把代码贴上:
import java.util.Stack;
import java.util.Scanner;
public class exper2has1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Stack<Character> one=new Stack<>();
Stack<Character> two=new Stack<>();
Stack<Character> three=new Stack<>();
int[]arr=new int[100];
int t=0;
String a=scanner.nextLine();
String b=scanner.nextLine();
for(int i=a.length()-1 ; i>= 0; i--)
{
one.push(a.charAt(i));
}
for(int i=b.length()-1 ; i>= 0 ; i--){
two.push(b.charAt(i));
}
int flag=0;
while(!two.empty())
{
if(!one.empty() && one.peek() == two.peek())
{
one.pop();
two.pop();
arr[t++] = 1;
}
else if(!three.empty() && three.peek() == two.peek())
{
three.pop();
two.pop();
arr[t++] = 3;
}
else if(one.empty() && !two.empty() && three.peek() != two.peek())
{
flag = 1;
break;
}
else
{
three.push(one.peek());
one.pop();
arr[t++] = 2;
}
}
if(flag==1)
System.out.println("Are you kidding me?");
else
{
int i = 0;
while (arr[i] != 0)
{
if(arr[i] == 1)
System.out.println("1->2");
else if(arr[i] == 2)
System.out.println("1->3");
else if(arr[i] == 3)
System.out.println("3->2");
i++;
}
}
}
}
讲讲实现的思路:首先依题意设置三个“轨道”,即栈。之后把input的字符串和output的字符串分别存在one栈和two栈之中。然后我建立了一个数组,用来存放指令数(当指令数为1时输出1->2;当指令数为2时输出1->3;当指令数为1时输出3->2;当然输出在循环结束后才输出了)之后开启循环条件(即当two栈不为空时),如果one栈不是空的且one的栈顶元素与two的栈顶元素相等,就同时拿到这两个元素,之后把指令数1存到数组之中;如果thre栈不是空的且three的栈顶元素与two的栈顶元素相等,就同时拿到这两个元素,之后把指令数3存到数组之中;如果one栈是空的且two栈不是空的且three的栈顶元素与two的栈顶元素不等(即列车全在3轨道聚着的时候),这时候output序列是不存在的,所以把标志flag定义为1,并退出循环;剩下的条件就是用来存放指令数2的。之后依据flag执行输出,其为1时输出“Are you kidding me?”,否则按顺序输出列车操作顺序。