堆栈是一种特殊的线性结构,后进先出,只能对栈顶元素操作,典型的操作入栈和出站。下面通过例子介绍基本用法。
题目:Train Problem
Problem Description
As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here comes a problem, there is only one railway where all the trains stop. So all the trains come in from one side and get out from the other side. For this problem, if train A gets into the railway first, and then train B gets into the railway before train A leaves, train A can't leave until train B leaves. The pictures below figure out the problem. Now the problem for you is, there are at most 9 trains in the station, all the trains has an ID(numbered from 1 to n), the trains get into the railway in an order O1, your task is to determine whether the trains can get out in an order O2.
Input
The input contains several test cases. Each test case consists of an integer, the number of trains, and two strings, the order of the trains come in:O1, and the order of the trains leave:O2. The input is terminated by the end of file. More details in the Sample Input.
Output
The output contains a string "No." if you can't exchange O2 to O1, or you should output a line contains "Yes.", and then output your way in exchanging the order(you should output "in" for a train getting into the railway, and "out" for a train getting out of the railway). Print a line contains "FINISH" after each test case. More details in the Sample Output.
Sample Input
3 123 321
3 123 312
Sample Output
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH
题目翻译:火车站非常繁忙,火车A先进站,如果火车B在火车A出站之前进站,则或者A只能等或者B出站之后再出站(后进先出)。题目要求有n(n最大为9,编号从1到n)列火车,给出火车进站的序列,并给出火车出站的序列,让你判断这个要求能否实现,如果能实现写出进站(in)、出站(out)的操作序列。
解题思路:基本原则就是后进先出,但是对于特定的火车来说是先进后出。所以首先考虑入栈的序列,在入栈的过程根据出栈序列判断是否需要出栈,如果不需要出栈,则继续进栈,如果需要出栈则进行出栈操作。如果要出栈的元素不在栈顶则表示序列不合法。下面以入栈序列1234和出栈序列1423进行分析。
考虑入栈:1进栈,栈顶元素为1;
考虑出栈:因为栈顶元素与出栈序列中的第一个元素相同,1出栈,出栈后栈中无元素;
考虑出栈:栈中无元素,所以不用出栈;
考虑入栈:2进栈,栈顶元素为2;
考虑出栈:因为栈顶元素是2,而要出栈的元素是4,所以不能出栈;
考虑入栈:3进栈,栈顶元素为3,栈中包括2和3;
考虑出栈:因为栈顶元素是3,而要出栈的元素是4,所以不能出栈;
考虑入栈:4进栈,栈顶元素为4,栈中包括2、3和4;
考虑出栈:因为栈顶元素是4,而要出栈的元素是4,所以4出栈,出栈后栈中元素为2和3,3为栈顶元素。
考虑出栈:因为栈顶元素是3,而要出栈的元素是2,所以不能出栈;
考虑入栈:所有元素已经入栈,所以不能出栈;
无法入栈也无法出栈,而栈中有元素,所以序列不合法。
下面是参考代码:
/*
* Train Problem I
*/
public static String test2(int n,String s1,String s2){
// 记录操作结果
StringBuffer sb = new StringBuffer();
// 表示栈
int[] a=new int[9];
// 表示栈顶元素
int index=-1;
// 入栈元素序号
int index1=0;
// 出栈元素序号
int index2=0;
// 把第一个元素放到栈中
index++;
a[index]=s1.charAt(index1);
index1++;
sb.append("in\n");
// 只要栈中有元素,则处理
while(index1<s1.length() || index2<s2.length()){
// 如果栈顶元素是与s2中的元素一致,则出栈
if(index>-1 && s2.charAt(index2)==a[index]){
index--;
sb.append("out\n");
index2++;
}else if(index1==s1.length()){ // 不能实现
break;
}else{ // 如果否则把s1中的下一个元素加入到栈中
index++;
a[index] = s1.charAt(index1);
index1++;
sb.append("in\n");
}
}
if(index!=-1){
return "No.\nFINISH\n";
}else{
sb.insert(0,"Yes.\n");
sb.append("FINISH\n");
return sb.toString();
}
}
分享到:
相关推荐
ACM 模版ACM 模版ACM 模版ACM 模版
本次课程论文,针对ACM比赛中的经典算法,动态规划,进行了详细的讲述,并以ZOJ和POJ上的经典题目为例,讲述了动态规划算法的应用。
北大acm.pku——40道简单题源码 全部本人原创,虽然写的一般但是一点心意,和大家分享, 都是水题,希望对大家有所帮助。
ACM准备模板 堆排序模板 acm 堆 排序
NULL 博文链接:https://yuyongjia.iteye.com/blog/1626488
ACM算法 题目解析 PPT教学 还有详细的题目讲解
ACM作业平台1-57题题目+AC代码,浙江工商大学信电学院C语言期末上机题目,代码入门级的C语言设计题目,适合初学C语言的同学,内容覆盖全面。
非常实用,非常经典!!!!!绝对独家!!!内部资料!!!
这是我在平时在网上收集的。 资源里面大概是些ACM历史,初赛,等一些试题。
一 个报告,新手用 没什么用的 随便看看个报告,新手用 没什么用的 随便看看个报告,新手用 没什么用的 随便看看
acm图论.ppt————电子版_ppt版
一高手的训练计划,分阶段介绍了训练的方向和内容,有用与否?你懂的~!!!
ACM数论——ppt(天津大学)ACM数论——ppt(天津大学)
ACM培训——算法入门---------------------------------算法入门ACM培训——算法入门---------------------------------算法入门ACM培训——算法入门---------------------------------算法入门
模板ACM———浙江大学与吉林大学 模板ACM———浙江大学与吉林大学 模板ACM———浙江大学与吉林大学 模板ACM———浙江大学与吉林大学 模板ACM———浙江大学与吉林大学
给刚接触 ACM 的同学提供做题时输入输出的知识。
大学生acm竞赛——10年12月竞赛题库 希望对你们有所帮助
清华大学ACM模板,汇集了很多算法的标准模式,而且有详细的算法讲解,图论、数论、网络流等等,从浅到深,彻底解剖,是ACM进阶者不二的选择~!
给刚接触ACM的同学提供字符串处理和有关随机数生成知识。
杭电ACM2131题c程序AC代码